按照列枚举,根据题意可知,每列更新过一次之后,这列就不会再更新;保证了无后效性;
注意有些点是走不到的,不能用这些点更新别的点;
dp[i][j]表示到达第i行第j列的金币数量

#include<bits/stdc++.h>
using namespace std;
const int maxn=200;
int dp[maxn][maxn],mp[maxn][maxn];
int r,c;
int main()
{
    cin>>r>>c;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
            cin>>mp[i][j];
    }

    memset(dp,-1,sizeof(dp));  dp[1][1]=0;
    for(int j=1;j<=c;j++)//列
    {
        for(int i=1;i<=r;i++)//行
        {
            dp[i][j]=max(max(dp[i][j],dp[i+1][j-1]),max(dp[i-1][j-1],dp[i][j-1]));
            if(dp[i][j]!=-1) dp[i][j]+=mp[i][j];//如果==-1,说明走不到,!=-1说明能到达
        }
    }
    cout<<dp[r][c];
}