标签:
因为一棵树的每个节点的度数至少为 1
所以先给每个节点分配 1 个度数
然后剩下 n-2 的度数
dp[j] 表示已经用了 j 度数 的最优解
dp[j] = max(dp[j-i+1] + f[i]-f[1]) (i是枚举最终点的度数)
就相当于是在用度数更大的点去替换度数为 1 的点
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 5005; 8 int n; 9 int dp[maxn],f[maxn]; 10 11 void solve(){ 12 memset(dp,0,sizeof(dp)); 13 dp[0] = f[1]*n; 14 for(int i = 2;i < n;i++){ 15 for(int j = i-1;j <= n-2;j++){ 16 dp[j] = max(dp[j],dp[j-i+1]+f[i]-f[1]); 17 // printf("dp[%d] = %d\n",j,dp[j]); 18 } 19 } 20 printf("%d\n",dp[n-2]); 21 } 22 23 int main(){ 24 int T; 25 scanf("%d",&T); 26 while(T--){ 27 scanf("%d",&n); 28 memset(f,0,sizeof(f)); 29 for(int i = 1;i < n;i++) scanf("%d",&f[i]); 30 solve(); 31 } 32 return 0; 33 }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4937294.html