<问题分析>
与数塔问题相似,状态转移方程,s[i][j]=max{s[i+1][k]} j-2<=k<=j+2
1 #include <stdio.h> 2 3 4 int main() 5 { 6 long v[201][201]; 7 int i,j,k,m,n; 8 scanf("%d %d",&m,&n); 9 for(i=1;i<=m;i++) 10 { 11 for(j=1;j<=n;j++) 12 { 13 scanf("%ld",&v[i][j]); 14 } 15 } 16 for(i=n-1;i>=1;i--) 17 { 18 for(j=1;j<=m;j++) 19 { 20 if(j-2>0) 21 { 22 k=v[i+1][j-2]; 23 } 24 if(j-1>0) 25 { 26 if(j-1==1) 27 { 28 k=v[i+1][j-1]; 29 } 30 else if(k<v[i+1][j-1]) 31 { 32 k=v[i+1][j-1]; 33 } 34 } 35 if(j==1) 36 { 37 k=v[i+1][j]; 38 } 39 else if(k<v[i+1][j]) 40 { 41 k=v[i+1][j]; 42 } 43 if(j+1<=m&&k<v[i+1][j+1]) 44 { 45 k=v[i+1][j+1]; 46 } 47 if(j+2<=m&&k<v[i+1][j+2]) 48 { 49 k=v[i+1][j+2]; 50 } 51 v[i][j]+=k; 52 } 53 } 54 k=v[1][1]; 55 for(i=2;i<=m;i++) 56 if(k<v[1][i]) 57 k=v[1][i]; 58 printf("%ld ",k); 59 return 0; 60 }