hdu5534 Partial Tree(dp)

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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pibaixinghei/article/details/52367275
上一篇计蒜客 百度地图的实时路况 (floyd+二分)
下一篇poj2318 TOYS(计算几何+叉积+二分)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭