HDU 1561 The more, The Better 树形DP(0-1背包)
中文题,题意自己看
树形DP
将0设为根节点,总攻击数为m,背包容量应该是m+1(0点也看做城堡);
基础的树形DP,自己推一下状态转移方程吧。
View Code
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; vector<int>edge[224]; int dp[224][224]; int p[224],m, n; void dfs(int u) { int i, j, k; dp[u][1]=p[u];//初始化 for(i=0;i<edge[u].size();i++) { int v = edge[u][i]; dfs(v); //将子节点的状态转移给父节点 for(j=m+1;j>=1;j--) for(k=1;k<j;k++)//注意,要攻击v,必须攻击u,所以j-k>=1; dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } int main( ) { int i, j, x; while(~scanf("%d%d",&n,&m)) { if(!n&&!m)break; for(i=0;i<=n;i++) edge[i].clear(); for(i=1;i<=n;i++) { scanf("%d%d",&x,&p[i]); edge[x].push_back(i); } p[0]=0;memset(dp,0,sizeof(dp)); dfs(0); printf("%d\n",dp[0][m+1]); } return 0; }


浙公网安备 33010602011771号