<问题分析>
状态转移函数 s[i][j]=max{s[i-1][k]}+a[i][j] i<=k<j
1 #include <stdio.h> 2 #include <string.h> 3 4 5 // s[i][j]=max{s[i-1][t]+a[i][j]} 6 int main() 7 { 8 int i,j,k,f,v,tag,a[101][101],s[101][101],w[101][101],t[101]; 9 scanf("%d %d",&f,&v); 10 for(i=1;i<=f;i++) 11 { 12 for(j=1;j<=v;j++) 13 { 14 scanf("%d",&a[i][j]); 15 } 16 } 17 for(i=1;i<=v;i++) 18 { 19 s[1][i]=a[1][i]; 20 } 21 for(i=2;i<=f;i++) 22 { 23 for(j=i;j<=v;j++) 24 { 25 tag=-510000; 26 for(k=i;k<j;k++) 27 { 28 if(tag<s[i-1][k]) 29 { 30 tag=s[i-1][k]; 31 w[i][j]=k; 32 } 33 } 34 s[i][j]=tag+a[i][j]; 35 } 36 } 37 j=f;k=s[f][f];t[f]=f; 38 for(i=f+1;i<=v;i++) 39 { 40 if(k<s[f][i]) 41 { 42 k=s[f][i];t[f]=i; 43 } 44 } 45 while(j>1) 46 { 47 j--; 48 t[j]=w[j+1][t[j+1]]; 49 } 50 printf("%d ",k); 51 for(i=1;i<f;i++) 52 printf("%d ",t[i]); 53 printf("%d ",t[f]); 54 while(true); 55 return 0; 56 }