#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1000000;
int n,t;
int b[maxn];
vector<int> sons[maxn];
int dp(int u)
{
if(sons[u].empty()) return 1;
int k=sons[u].size();
vector<int> d;
for(int i=0;i<k;i++)
d.push_back(dp(sons[u][i]));
sort(d.begin(),d.end());
int c=(k*t-1)/100+1;
int ans=0;
for(int i=0;i<c;i++) ans+=d[i];
return ans;
}
int main()
{
while(scanf("%d%d",&n,&t)!=EOF)
{
if(n==0&&t==0)
break;
for(int i=0;i<=n;i++)
sons[i].clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
sons[b[i]].push_back(i);
}
printf("%d\n",dp(0));
}
return 0;
}
这个是第一个树形的DP问题,利用的DFS的方法还是比较好的,需要好好理解体会啊。
UVa 12186
最新推荐文章于 2019-11-04 19:25:55 发布