从根走k步获得的最大权值。
感觉情况不容易弄全。而步数从大到小有种背包的感觉。
#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> #include <iostream> #include <cstdlib> #include <string> #include <vector> using namespace std; int dp[210][410][3];//0是回,1是不回 int val[210],k,n; vector<int>edge[210]; void dfs(int u,int fa) { for (int i=0;i<edge[u].size();i++) { int son=edge[u][i]; if (son==fa) continue; dfs(son,u); for (int v=k;v>=0;v--) { for (int j=0;j<=v;j++) { dp[u][v][0]=max(dp[u][v][0],dp[u][v-j][0]+dp[son][j-2][0]); dp[u][v][1]=max(dp[u][v][1],dp[u][v-j][0]+dp[son][j-1][1]); dp[u][v][1]=max(dp[u][v][1],dp[u][v-j][1]+dp[son][j-2][0]); } } } } int main() { while (scanf ("%d%d",&n,&k)!=EOF) { for (int i=0;i<205;i++) edge[i].clear(); for (int i=1;i<=n;i++) { scanf ("%d",&val[i]); for (int j=0;j<=k;j++) { dp[i][j][0]=dp[i][j][1]=val[i]; } } for (int i=0;i<n-1;i++) { int t1,t2; scanf ("%d%d",&t1,&t2); edge[t1].push_back(t2); edge[t2].push_back(t1); } dfs(1,0); printf ("%d\n",max(dp[1][k][0],dp[1][k][1])); } return 0; }
时间: 2024-10-26 16:20:40