树形DP。。。。
You're given a tree with weights of each node, you need to find the maximum subtree of specified size of this tree.
Tree Definition
A tree is a connected graph which contains no cycles.
Input
There are several test cases in the input.
The first line of each case are two integers N(1 <= N <= 100), K(1 <= K <= N), where N is the number of nodes of this tree, and K is the subtree's size, followed by a line with N nonnegative integers, where the k-th integer indicates the weight of k-th node. The following N - 1 lines describe the tree, each line are two integers which means there is an edge between these two nodes. All indices above are zero-base and it is guaranteed that the description of the tree is correct.
Output
One line with a single integer for each case, which is the total weights of the maximum subtree.
Sample Input
3 110 20 30
0 1
0 2
3 2
10 20 30
0 1
0 2
Sample Output
3040
Author: LIU, Yaoting
#include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; int dp[200][200],valu[200],cnt[200],ans,N,K; vector<int> g[200]; int dfs(int u,int fa) { cnt for(int i=0;i<g { int v=g if(v==fa) continue; cnt } for(int k=0;k<g { int v=g if(v==fa) continue; for(int i=cnt { for(int j=0;j<i&&j<=cnt[v];j++) dp } } if(cnt { ans=max(ans,dp } return cnt } int main() { while(scanf("%d%d",&N,&K)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=0;i<N;i++) { scanf("%d",valu+i); dp g } for(int i=0;i<N-1;i++) { int a,b; scanf("%d%d",&a,&b); g[a].push_back(b); g } ans=0;dfs(0,-1); printf("%d ",ans); } return 0; } |