树形动态规划 java_树形动态规划

//大数组的定义最好不要写在函数里,这样会使函数栈控件不足

#include

#include

#include

#define M 1000//数组最大长度

int shu[M][M],xb[M][M],shs[M],qf[M],f[M][2];

int main()

{

int i,j,l,k,n,maxlev,s,x,a,b;

memset(shu,0,sizeof(shu));

memset(xb,0,sizeof(xb));

memset(shs,0,sizeof(shs));

memset(f,0,sizeof(f));

//1、建树

scanf("%d",&n);

for(i=1;i<=n;i++)scanf("%d",&qf[i]);

l=k=1;

while(l&&k)

{

scanf("%d%d",&l,&k);

shs[l]=k;

xb[k][0]++;

xb[k][xb[k][0]]=l;

}

maxlev=-1;

for(i=1;i<=n;i++)

{

x=shs[i],s=1;

while(x!=0){s++;x=shs[x];}

shu[s][0]++;

shu[s][shu[s][0]]=i;

if(s>maxlev)maxlev=s;

}

//2、动态规划

for(i=maxlev;i>0;i--)

{

for(j=1;j<=shu[i][0];j++)

{

if(xb[shu[i][j]][0]==0)

{

f[shu[i][j]][0]=0;

f[shu[i][j]][1]=qf[shu[i][j]];

}

else

{

f[shu[i][j]][0]=0;

f[shu[i][j]][1]=qf[shu[i][j]];

for(k=1;k<=xb[shu[i][j]][0];k++)

{

a=f[xb[shu[i][j]][k]][0];b=f[xb[shu[i][j]][k]][1];

f[shu[i][j]][1] +=a;//如果要当前节点,则不能取下部节点

//如果不要当前节点,则可要可不要下部节点,取使得气氛值最大的方案

if(b>a)a=b;

f[shu[i][j]][0] +=a;

}

}//状态转移

}

}

s=0;

for(i=1;i<=shu[1][0];i++)//从树根获取最优方案

{

a=f[shu[1][i]][0];b=f[shu[1][i]][1];

if(b>a)a=b;

s+=a;

}

printf("最大气氛值:%d\n",s);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值