HDU 5534 Partial Tree(完全背包)

来源:互联网 发布:知乎ios源码 编辑:程序博客网 时间:2024/05/29 18:16


题意:给一颗N个节点的树,f(i)表示度数为i的节点的点权,问这棵树最大点权。

思路:每个点首先分配f(1),然后再从剩下的n-2中选出剩下的度,相当于一个完全背包问题。

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define LL long long#define pii pair<int, int>//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int MAXN = 2500;const LL INF = 1e16;int n, maxv;int f[MAXN];LL dp[MAXN];int main() {    //freopen("input.txt", "r", stdin);    int T; cin >> T;while(T--) {maxv = 0;cin >> n;for(int i = 1; i <= n-2; i++) dp[i] = -INF;for(int i = 1; i < n; i++) scanf("%d", &f[i]);for(int i = 0; i <= n-2; i++) {for(int j = 2; j < n; j++) {if(i>=j-1) dp[i] = max(dp[i], dp[i-j+1]+f[j]-f[1]);}}cout << dp[n-2]+(LL)n*f[1] << endl;}    return 0;}

0 0
原创粉丝点击