这题跟数字金字塔的做法类似。。

只不过数字金字塔是往两条路线搜索,这题是往三条路线搜。。。

动态方程: f[i][j]=max(max(f[i-1][j],f[i-1][j-1]),f[i-1][j+1])+a[i][j];

#include <cstdio>
using namespace std;
int m,n,mid,dp[205][205],nm[205][205];
int max(int a,int b){return a>b?a:b;}
int main(){
    scanf("%d%d",&n,&m);
    mid=m/2+1;
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&nm[i][j]);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dp[i][j]=max(max(dp[i-1][j],dp[i-1][j-1]),dp[i-1][j+1])+nm[i][j];
        }
    }
    printf("%d",max(max(dp[n][mid],dp[n][mid-1]),dp[n][mid+1]));
    return 0;
}