//大數組的定義最好不要寫在函數裏,這樣會使函數棧控件不足 #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)); //一、建樹 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; } //二、動態規劃 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; }