关闭

hdu5534 Partial Tree(dp)

43人阅读 评论(0) 收藏 举报

hdu5534

题目

就是给你n个点,要连n-1条边形成一棵树,最后有个cool值,cool值是所有节点的f值的和,f值与节点的度数有关,具体f1~fn-1事先都已经给出。

思路

不用考虑图上的东西,从度考虑,每个点至少1个度,总共2n-2个度,所以要分派n-2个度,dp[i]表示分配了i个度时的最大值。转移方程中的i-1的原因是已经分配掉了一个度,实际增加的是i-1度。注意f2~fn-1要减去f1。

代码

#include<cstdio>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;

int n;
int f[2025];
int dp[2025];

int solve(int m)
{
    for(int i=0; i<=m; i++) dp[i]=-0x3f3f3f3f;
    dp[0]=0;
    for(int i=2; i<n; i++)
        for(int j=0; j+i-1<=m; j++)
            dp[j+i-1]=max(dp[j]+f[i],dp[j+i-1]);
    return dp[m];
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1; i<n; i++)
            scanf("%d",&f[i]);
        int ans=f[1]*n;
        for(int i=2; i<n; i++)
            f[i]-=f[1];
        printf("%d\n",ans+solve(n-2));
    }
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18520次
    • 积分:1640
    • 等级:
    • 排名:千里之外
    • 原创:155篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条