HDU1561 树形DFS+DP

来源:互联网 发布:聊城气象数据 编辑:程序博客网 时间:2024/06/06 17:28

题意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?



#include<stdio.h>#include<string.h>#define N 205int n,m,edgeNum=0;int ans[N],dp[N][N],f[N][N];int visit[N],head[N];struct Line{int v,next;}edge[N];int max(int a,int b){return a>b?a:b;}void add(int u,int v){    edge[edgeNum].v=v;    edge[edgeNum].next=head[u];    head[u]=edgeNum++;}void dfs(int root){    visit[root]=1;    for(int i=head[root];i!=-1;i=edge[i].next)    {        int u=edge[i].v;        if(!visit[u])        {            dfs(u);            for(int k=m;k>=0;k--)              for(int j=0;j<=k;j++)              f[root][k]=max(f[root][k],f[root][k-j]+dp[u][j]);        }    }    for(int i=1;i<=m+1;i++)      dp[root][i]=f[root][i-1]+ans[root];}int main(){    int a,b;    freopen("a.txt","r",stdin);        while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0) break;        edgeNum=ans[0]=0;        memset(f,0,sizeof(f));        memset(dp,0,sizeof(dp));        memset(head,-1,sizeof(head));        memset(visit,0,sizeof(visit));        for(int i=1;i<=n;i++)        {            scanf("%d%d",&a,&b);            ans[i]=b;            add(a,i);        }        dfs(0);        printf("%d\n",dp[0][m+1]);    }}


原创粉丝点击