hdu1520 Anniversary party 树形dp
2013-04-18 14:32
417 查看
hdu1520
比之前树形背包要简单多了,没有背包的体积限制
dp[ i ] [ 0 ] 以i为根(不包括i本身)的树上取到的最大值
dp[ i ] [ 1 ] 以i为根(包括i本身)的树上取到的最大值
比之前树形背包要简单多了,没有背包的体积限制
dp[ i ] [ 0 ] 以i为根(不包括i本身)的树上取到的最大值
dp[ i ] [ 1 ] 以i为根(包括i本身)的树上取到的最大值
#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; int N,V[6100]; vector<int>son[6010]; int dp[6100][2],vis[6100]; void dfs(int n){ vis =1; int len=son .size(); dp [1]=V ; for(int i=0;i<len;i++){ int k=son [i]; if(vis[k]) continue; dfs(k); if(dp [1]<dp [1]+dp[k][0]) dp [1]=dp [1]+dp[k][0]; dp [0]=max(dp [0],max(dp [0]+dp[k][1],dp [0]+dp[k][0])); } } int main() { int i,j,k,u,v; while(scanf("%d",&N)!=EOF) { memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); for(i=1;i<=N;i++){ scanf("%d",&V[i]); son[i].clear(); } while(scanf("%d%d",&u,&v),u||v){ son[v].push_back(u); vis[u]=1; //非根节点 } for(i=1;i<=N;i++) if(vis[i]==0){ memset(vis,0,sizeof(vis)); // printf("%d\n",i); dfs(i);//for(j=1;j<=N;j++) printf("%d %d %d\n",j,dp[j][0],dp[j][1]); // printf("%d %d\n",dp[i][0],dp[i][1]); printf("%d\n",max(dp[i][0],dp[i][1])); } } return 0; } /* 7 1 -1 -1 -1 -1 -1 -1 1 3 2 3 6 4 7 4 4 5 3 5 0 0 */
相关文章推荐
- poj2342|hdu 1520 Anniversary party 树形dp
- HDU 1520 Anniversary party 树形dp
- HDU 1520 Anniversary party (树形dp) 解题报告
- HDU 1520 Anniversary party(树形DP)
- HDU 1520 Anniversary party / 树形DP水题!!!
- hdu 1520 Anniversary party 树形DP
- HDU 1520 Anniversary party (树形DP)
- hdu 1520 Anniversary party(树形DP)
- HDU 1520 Anniversary party(树形DP)
- HDU 1520 Anniversary party (树形DP)
- HDU 1520 & POJ 2342 Anniversary party(树形dp)
- hdu(1520) Anniversary party(树形dp)
- HDU 1520 Anniversary party(树形dp)
- HDU1520 Anniversary party 解题报告【树形DP】
- hdu 1520 Anniversary party(树形dp)
- hdu 1520 Anniversary party 树形dp
- hdu 1520 Anniversary party 树形dp入门
- [HDU] 1520 Anniversary party 入门树形DP
- Hdu 1520 Anniversary party(树形DP)
- HDU 1520 Anniversary party (简单树形DP入门)