树形dp回顾Anniversary party

来源:互联网 发布:轩辕剑坐骑10进阶数据 编辑:程序博客网 时间:2024/06/01 09:55


这道题真的是已经被用烂了。

一个是最大人数是多少,一个是最大的happy值是多少,都是大同小异的。

从树根开始dfs做dp

如果这个人是来的

那么dp[root][1]先初始化,继续向下做dp。

然后最后的状态方程式

dp[root][0]+=max(dp[child][0],dp[child][1]);

dp[root][1]+=dp[child][0];


#include<bits/stdc++.h>using namespace std;const int maxn = 6005;vector<int>v[maxn];int indegree[maxn],vis[maxn],dp[maxn][2],happy[maxn];int n,a,b;int findroot(){    for(int i=0; i<=maxn; i++)    {        if(vis[i]&&indegree[i]==0)            return i;    }}void dfs(int root)//dp{    dp[root][1]=happy[root];    for(int i=0; i<v[root].size(); i++)        dfs(v[root][i]);    for(int i=0; i<v[root].size(); i++)    {        dp[root][0]+=max(dp[v[root][i]][0],dp[v[root][i]][1]);        dp[root][1]+=dp[v[root][i]][0];    }}int main(){    while(cin>>n)    {        memset(indegree,0,sizeof(indegree));        memset(dp,0,sizeof(dp));        memset(vis,0,sizeof(vis));        for(int i=1; i<=n; i++)        {            cin>>happy[i];            v[i].clear();        }        while(cin>>a>>b,a||b)        {            v[b].push_back(a);            vis[a]=1;            vis[b]=1;            indegree[a]++;        }        int root = findroot();//find the root        dfs(root);        //cout<<root<<endl;        cout<<max(dp[root][0],dp[root][1])<<endl;    }    return 0;}


0 0
原创粉丝点击