NOIP2000
<问题分析>
状态转移方程 s[k][i][j]=max{s[k-1][i-1][j-1],s[k-1][i][j-1],s[k-1][i-1][j],s[k-1][i][j]}+a[i][k-i]+a[j][k-j] (i<>j)
s[k][i][j]=s[k-1][i-1][j]+a[i][k-1]
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int n,tag,i,j,k,a[11][11],s[22][11][11]; 7 scanf("%d",&n); 8 memset(a,0,11*11*sizeof(int)); 9 while(scanf("%d %d %d",&i,&j,&k),i||j||k) 10 { 11 a[i][j]=k; 12 } 13 s[1][0][1]=0; 14 for(k=2;k<=2*n;k++) 15 { 16 for(i=1;i<=n;i++) 17 { 18 if(k-i>0&&k-i<=n) 19 for(j=1;j<=n;j++) 20 { 21 if(k-j<=0||k-j>n) 22 continue; 23 if(i==j) 24 { 25 s[k][i][j]=s[k-1][i-1][j]+a[i][k-i]; 26 continue; 27 } 28 tag=0; 29 if(s[k-1][i-1][j-1]>tag) 30 tag=s[k-1][i-1][j-1]; 31 if(s[k-1][i-1][j]>tag) 32 tag=s[k-1][i-1][j]; 33 if(s[k-1][i][j-1]>tag) 34 tag=s[k-1][i][j-1]; 35 if(s[k-1][i][j]>tag) 36 tag=s[k-1][i][j]; 37 s[k][i][j]=a[i][k-i]+a[j][k-j]+tag; 38 } 39 } 40 } 41 printf("%d\n",s[2*n][n][n]); 42 while(true); 43 return 0; 44 }