计蒜客 课程学分总数

题目链接  课程学分总数

很基础的树型DP。注意输入数据可能是森林而不是完整的一棵树。
那么给所有没有祖先的点加一个公共的根就好了。
 
#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)

typedef long long LL;

const int N = 305;

int f[N][N], sz[N], c[N];
vector <int> v[N];
int n, m;

void dfs(int x){
	sz[x] = 1;
	f[x][1] = c[x];
	for (auto u : v[x]){
		dfs(u);
		dec(i, sz[x], 1) rep(j, 1, sz[u]) f[x][i + j] = max(f[x][i + j], f[x][i] + f[u][j]);
		sz[x] += sz[u];
	}

}

int main(){

	scanf("%d%d", &n, &m);
	++n, ++m;
	rep(i, 2, n){
		int x, y;
		scanf("%d%d", &x, c + i);
		++x; v[x].push_back(i);
	}

	dfs(1);
	printf("%d\n", f[1][m]);
	return 0;
}

 

 
posted @ 2017-07-20 20:28  cxhscst2  阅读(243)  评论(0编辑  收藏  举报