@2015ACM/ICPC亞洲區長春站-重現賽(感謝東北師大) @HDU5534 (Dp,完全揹包)
題目描述
In mathematics, and more specifically in graph theory, a tree is an undirected graph in which any two nodes are connected by exactly one path. In other words, any connected graph without simple cycles is a tree. You find a partial tree on the way home. This tree has n nodes but lacks of n 1 edges. You want to complete this tree by adding n - 1 edges. There must be exactly one path between any two nodes after adding. As you know, there are nn−2 ways to complete this tree, and you want to make the completed tree as cool as possible. The coolness of a tree is the sum of coolness of its nodes. The coolness of a node is f(d), where f is a predefined function and d is the degree of this node. What’s the maximum coolness of the completed tree?
輸入
The first line contains an integer T indicating the total number of test cases. Each test case starts with an integer n in one line, then one line with n-1 integers f(1), f(2), . . . , f(n-1). 1≤T≤2015 2≤n≤2015 0≤f(i)≤10000 There are at most 10 test cases with n > 100.
輸出
For each test case, please output the maximum coolness of the completed tree in one line.
樣例輸入
2 3 2 1 4 5 1 4
樣例輸出
5 19
圖, 每個度 都有一個權值,
n-1條邊 去構造圖, 儘量滿足可以形成圖的情況下, 度數權值最大.求最大值.
題解:
很容易想到 揹包, ,而且是不限量的揹包, 即完全揹包.
一個圖的度數 是固定的 即 2*n-2; 又要保證圖存在, 那麼每個點至少度為1. 則 容量為 n-2
即 n個點分配n-2的度.
那麼完全揹包 可解:
初始值為 n*f[1] 揹包的時候 權值為 f[i+1] -f[1] 就可以/
[程式碼]
#include <bits/stdc++.h> #include <stdio.h> #define rep(i,a,n) for(int i=a;i<=n;i++) #define per(i,a,n) for(int i=n;i>=a;i--) typedef long long ll; const int maxn = 1e5+10; const int mod =1e9+7; const int inf = 0x3f3f3f3f; using namespace std; int dp[maxn]; int f[maxn]; int main(int argc, char const *argv[]) { int T; scanf("%d",&T); while(T--) { memset(dp,-inf,sizeof(dp)); memset(f,0,sizeof(f)); int n; scanf("%d",&n); rep(i,1,n-1) { scanf("%d",&f[i]); } // V = 2*n-2 - n = n-2; dp[0] = n*f[1]; rep(i,1,n-2) { rep(j,i,n-2) { dp[j] = max(dp[j],dp[j-i]+f[i+1]-f[1]); } } printf("%d\n",dp[n-2] ); } return 0; }