因为此题可以转化为两个人同时从左上往右下走的问题,所以可以使用方格取数题目的代码(需要稍加修改以满足题意)
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int a[N][N],dp[2*N][N][N];
int main(void)
{
int n,m,k,i,j;
cin>>m>>n;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(k=1;k<=n+m-2;k++) // 记录步数,最多能走n+m-2步
{
for(i=1;i<=m;i++) // i表示甲的当前位置的行数
{
for(j=1;j<=m;j++) // j表示乙的当前位置的行数
{
// 甲当前位置的列数为k+2-i,乙当前位置的列数为k+2-j
if(k+2-i>n||k+2-j>n||k+2-i<1||k+2-j<1)continue;//因为列数是计算得到的,所以有可能不合法
int add=a[i][k+2-i];
if(i!=j)add+=a[j][k+2-j]; // 如果位置不同才能加上另一个位置的值
int &x=dp[k][i][j];
x=max(x,dp[k-1][i][j]);
x=max(x,dp[k-1][i-1][j]);
x=max(x,dp[k-1][i-1][j-1]);
x=max(x,dp[k-1][i][j-1]);
x+=add;
}
}
}
printf("%d",dp[n+m-2][m][m]); // 第n+m-2步(走完了),甲乙都走到第m行
// 当然在约束关系的作用下也都会走到第n列
return 0;
}