hdu5534 Partial Tree 完全背包

来源:互联网 发布:便宜好用的粉底液 知乎 编辑:程序博客网 时间:2024/05/29 13:08
//对于度数为i,其权值为f[i]//问怎样构建一棵点数为n的树,使得它们的权值之和最大,求这个最大值//这棵树的总点数为2*(n-1),先将所有的点都分配一个度//然后在剩下的n-2个度用完全背包做//dp[i]表示i个度的最大值#include<cstdio>#include<cstring>#include<iostream>using namespace std  ;const int maxn = 3010 ;int f[maxn] ;int dp[maxn] ;int main(){    int t ;    scanf("%d" , &t) ;    while(t--)    {        int n ;        scanf("%d" , &n) ;        for(int i = 1;i < n;i++)        scanf("%d" , &f[i])  ;        memset(dp , 0 , sizeof(dp)) ;        dp[0] = n*f[1] ;        for(int i = n-1;i > 0;i--){            f[i] -= f[1] ;        }        for(int i = 0;i <= n-2;i++)            for(int j = i;j <= n-2;j++){                dp[j] = max(dp[j] , dp[j-i] + f[i+1]) ;            }        cout<<dp[n-2]<<endl;    }}

0 0
原创粉丝点击