标签:
dp[0][i][j]表示以i为根节点步行j步,且最终回到i,可以得到的最大苹果数量。dp[1][i][j]表示最终不回到i可以得到的最大苹果数量。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <map> using namespace std; #define N 221 #define inf 0x7f7f7f7f int dp[2][N][N]; int root; int n,k; int cost[111]; vector<int>g[N]; int vis[N]; void dfs(int s){ for(int i=0;i<=k;i++){ dp[0][s][i]=dp[1][s][i]=cost[s];//初始化 } vis[s] = 1; for(int i=0;i<g[s].size();i++){ int e = g[s][i]; if(!vis[e]){ dfs(e); for(int j = k;j >= 0;j--){ for(int h=0;h <= j;h++){ dp[0][s][j+2]=max(dp[0][s][j+2],dp[0][e][h]+dp[0][s][j-h]); dp[1][s][j+2]=max(dp[1][s][j+2],dp[0][e][h]+dp[1][s][j-h]); dp[1][s][j+1]=max(dp[1][s][j+1],dp[1][e][h]+dp[0][s][j-h]); } } } } } int main(){ while(scanf("%d%d",&n,&k)!=EOF){ memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); memset(cost,0,sizeof(cost)); for(int i=1;i<=n;i++){ g[i].clear(); scanf("%d",&cost[i]); } for(int i=1;i<n;i++){ int s,e; scanf("%d%d",&s,&e); g[s].push_back(e); g[e].push_back(s); } dfs(1); printf("%d\n",dp[1][1][k]); } }
标签:
原文地址:http://blog.csdn.net/u013076044/article/details/45823941