您的位置:首页 > 其它

HDU 1561(树形dp)

2016-08-15 16:17 441 查看
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;

int dp[210][210];
vector<int> list[210];
int N, M;

void dfs(int father)
{
for (decltype(list[father].size())i = 0; i <list[father].size(); i++)
{
int child = list[father][i];
if (list[child].size() > 0)
{
dfs(child);
}
for (int j = M; j >=2; j--)
{
for (int k =1; k < j; k++)
{
dp[father][j] = max(dp[father][j], dp[father][k] + dp[child][j - k]);
}
}
}
}
int main()
{
while (scanf("%d%d",&N,&M), N + M)
{
M++;
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= N; i++)
{
int a, b;
cin >> a >> b;
list[a].push_back(i);
for (int j = 1; j <= M; j++)
{
dp[i][j] = b;
}
}
dfs(0);
for (int i = 0; i <= N; i++)
{
list[i].clear();
}
cout << dp[0][M] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp dfs 树形dp HDU