首页 > 代码库 > 计蒜客 课程学分总数

计蒜客 课程学分总数

题目链接  课程学分总数

很基础的树型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;}

 

 
 
 

计蒜客 课程学分总数