从左上角到右下角一条+从右下角到左上角一条
==从左上角到右下角两条 2333
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int N = 52;
const long long inf = 0x3f3f3f3f;
const double eps = 1e-5;
const double pi = acos(-1);
int a[N][N], f[N][N][N][N];
int main()
{
int m, n, i, j, k, p;
scanf("%d%d", &m, &n);
for(i = 1; i <= m; ++i)
for(j = 1; j <= n; ++j)
scanf("%d", &a[i][j]);
for(i = 1; i <= m; ++i)
for(j = 1; j <= n; ++j)
for(k = 1; k <= m; ++k)
{
int p = i+j-k; //略做优化
if(p >= 1 && p <= n && i < k) //保证在范围内,且i、j 路线偏右上, k、p 路线偏左下,保证不会重叠相交
{
int tmp1 = max(f[i][j-1][k][p-1], f[i][j-1][k-1][p]); //f[i][j-1] 确定的情况下, 找 [k][p]较优解
int tmp2 = max(f[i-1][j][k][p-1], f[i-1][j][k-1][p]); //f[i-1][j] 确定的情况下, 找 [k][p]较优解
tmp1 = max(tmp1, tmp2); //找出四个可能里最大的
f[i][j][k][p] = max(f[i][j][k][p], tmp1 + a[i][j] + a[k][p]); //加上此处的好感值
}
}
printf("%d\n", f[m-1][n][m][n-1]);
return 0;
}