Anniversary party HDU - 1520 +樹形DP

dp[i][0]=Σmax(dp[son][0],dp[son][1]) ;父節點不取,則取全部兒子節點取或不取的之和的最大值,兒子節點不取是由於爲負數
dp[i][1]=a[i] + Σdp[son][0] ;父節點取,則加上全部兒子節點不取的之和
最終結果就是max{dp[root][0],dp[root][1]}

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#define ll long long

using namespace std;
int n,a[6005],x,y,vis[6005],dp[6005][2],root;
vector<int> v[6005];

void dfs(int x)
{
    dp[x][0]=0;
    dp[x][1]=a[x];
    for(int i=0;i<v[x].size();i++)
    {
        int y=v[x][i];
        dfs(y);
        dp[x][0]+=max(dp[y][0],dp[y][1]);
        dp[x][1]+=dp[y][0];
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    while(cin >> n)
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
            v[i].clear();
        for(int i=1;i<=n;i++)
            cin >> a[i];
        while(cin >> x >> y,x||y)
        {
            v[y].push_back(x);
            vis[x]=1;
        }
        for(int i=1;i<=n;i++)
        {
            if(vis[i]==0)
            {
                root=i;
                break;
            }
        }
        dfs(root);
        cout << max(dp[root][0],dp[root][1]) << endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章