1. 程式人生 > >2015年ACM/ICPC長春賽區 H題

2015年ACM/ICPC長春賽區 H題

題目連結:

題意:給你n(n<=2015)個點,定義f(x)為度為x的點的值。然後給你f(1)~f(n-1)。

讓你構造一棵樹,使所有點的值之和最大。只需要輸出這個最大值。

思路:很容易想到,由握手定理,所有點度數之和為2*n-2。由於是樹(連通),每個點至少分配1度。

然後剩下的n-2度就可以做一個01揹包了。

程式碼:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2040;
int dp[maxn],n,m,k;
int f[maxn];
int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<n;i++)
        scanf("%d",&f[i]);
        for(int i=0;i<=n;i++)
        dp[i]=-inf;
        m=n-2;
        dp[0]=f[1]*n;
        for(int i=0;i<n-1;i++)
        for(int j=0;j+i<=m;j++)
        dp[j+i]=max(dp[j+i],dp[j]+f[i+1]-f[1]);
        printf("%d\n",dp[m]);
    }
    return 0;
}