hdu1561,树形dp+背包

来源:互联网 发布:python前景 知乎 编辑:程序博客网 时间:2024/05/06 23:26

有n个城堡,要攻打m个城堡获取财富,但是有些城堡不能直接攻打,要求先攻打某个其他城堡才能攻打这个城堡。

这道题算是一个有依赖关系的背包问题。

基本上是自己的思路,好高兴。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define INF 200000000int n,m,dp[205][205],first[205],next[405],v[205],f[205][205];struct edge{    int u;    int v;}en[405];int max(int a,int b){    return a>b?a:b;}void add(int a,int b,int p){    en[p].u=a;    en[p].v=b;    next[p]=first[a];    first[a]=p;}void getdp(int s,int fu){    int i,j,k,l;    for(i=first[s];i!=-1;i=next[i])    {        if(en[i].v!=fu)        {            getdp(en[i].v,s);        }    }    for(i=0;i<=n;i++)        for(j=0;j<=m;j++)            f[i][j]=-INF;    f[0][0]=0;    for(i=first[s],l=0;i!=-1;i=next[i])    {        if(en[i].v!=fu)        {            l++;            for(j=0;j<=m;j++)            {                if(dp[en[i].v][j]!=-1)                {                    for(k=m;k>=j;k--)                    {                        if(f[l-1][k-j]!=-INF)                        {                            f[l][k]=max(f[l][k],f[l-1][k-j]+dp[en[i].v][j]);                        }                    }                }            }        }    }    for(i=0;i<=m;i++)    {        for(j=0;j<=l;j++)        {            dp[s][i]=max(dp[s][i],f[j][i]);        }    }    dp[s][0]=0;    if(s!=0)    {        for(i=m;i>=1;i--)            if(dp[s][i-1]!=-1)            dp[s][i]=dp[s][i-1]+v[s];    }    else    {        for(i=m;i>=1;i--)            if(dp[s][i-1]!=-1)            dp[s][i]=max(dp[s][i],dp[s][i-1]+v[s]);    }}int main(){    int i,j,k,l,idx,a;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0)            break;        for(i=0;i<=n;i++)            first[i]=-1;        for(i=0;i<=n*2;i++)            next[i]=-1;        for(i=0;i<=n;i++)            for(j=0;j<=m;j++)            dp[i][j]=-1;        /*memset(first,-1,sizeof(first));        memset(next,-1,sizeof(next));        memset(dp,-1,sizeof(dp));*/        idx=0;        for(i=1;i<=n;i++)        {            scanf("%d%d",&a,&v[i]);            idx++;            add(a,i,idx);        }        v[0]=0;        getdp(0,-1);        printf("%d\n",dp[0][m]);    }    return 0;}


0 0
原创粉丝点击