标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8667 Accepted Submission(s): 3748
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=40000;
int n,x,y,a[6005],dp[6005][3],indeg[6005];
vector<int> G[6005];
int solve()
{
int ans=0;
queue<int> q;
for(int i=1;i<=n;i++)
{
ans=max(ans,a[i]);
dp[i][1]=a[i];
dp[i][0]=0;
if(!indeg[i]) {q.push(i);}
}
while(q.size())
{
int u=q.front();q.pop();
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
dp[v][0]+=max(dp[u][0],dp[u][1]);
dp[v][1]+=dp[u][0];
indeg[v]--;
if(!indeg[v]) q.push(v);
ans=max(ans,max(dp[v][0],dp[v][1]));
}
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++) {G[i].clear();scanf("%d",&a[i]);}
MM(indeg,0);
for(;;)
{
scanf("%d %d",&x,&y);
if(!x&&!y) break;
G[x].push_back(y);
indeg[y]++;
}
printf("%d\n",solve());
}
return 0;
}
分析:应该是最基础的树形dp吧,按照DAG建好图后,从叶子节点u考虑(其只能为子节点),设
dp[u][0]为不选u节点时所能得到的最大rating
dp[u][1]为选u节点所能得到的最大rating
对于其父节点v构建状态转移方程:
dp[v][0]+=max(dp[u][0],dp[u][1]);(只能选其中一个)
dp[v][1]+=dp[u][0];
最后按照DAG往上扫上去就好
hdu 1520 Anniversary party 生日party 树形dp第一题
标签:
原文地址:http://www.cnblogs.com/smilesundream/p/5657256.html