标签:mem size while i++ clu eof shu == 结构
//大数组的定义最好不要写在函数里,这样会使函数栈控件不足 #include<stdio.h> #include<stdlib.h> #include<string.h> #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; }
标签:mem size while i++ clu eof shu == 结构
原文地址:http://www.cnblogs.com/tangshiguang/p/6770721.html