2015年ACM/ICPC長春賽區 H題
阿新 • • 發佈:2018-12-12
題目連結:
題意:給你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; }