采用的动态规划
状态:f[i][j]表示李大水牛走到格子(i,j)时能获得的最大价值
转移:f[i][j]=max(max(f[i+1][j+1],f[i+1][j]),f[i+1][j-1])+a[i][j] 对下一行(题目是从下往上走的)三个能走到当前格子的所能获得的最大价值取最大值再加上现在这个格子的价值,还是比较好想的
注意:下一行三个格子如果没能被走到,那下一行三个格子就不能往上转移到这个格子
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,f[210][210],a[210][210],ans=-9999999; 4 int main(){ 5 scanf("%d%d",&n,&m); 6 for(int i=1;i<=n;i++){ 7 for(int j=1;j<=m;j++){ 8 scanf("%d",&a[i][j]); 9 } 10 } 11 for(int i=0;i<=n+1;i++){ 12 for(int j=0;j<=m+1;j++){ 13 f[i][j]=-9999999; 14 } 15 } 16 f[n][m/2]=a[n][m/2];f[n][m/2+1]=a[n][m/2+1];f[n][m/2+2]=a[n][m/2+2]; 17 for(int i=n-1;i>=1;i--){ 18 for(int j=1;j<=m;j++){ 19 if(f[i+1][j+1]!=-9999999 || f[i+1][j]!=-9999999 || f[i+1][j-1]!=-9999999){ 20 f[i][j]=max(max(f[i+1][j+1],f[i+1][j]),f[i+1][j-1])+a[i][j]; 21 } 22 } 23 } 24 for(int j=1;j<=m;j++){ 25 ans=max(ans,f[1][j]); 26 } 27 cout<<ans; 28 return 0; 29 }