#include<bits/stdc++.h>
using namespace std;
const int N = 110;//n+m
int f[N][N][N];
int w[N][N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>w[i][j];
for(int k=2;k<=n+m;k++)
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++)
{
int j1=k-i1,j2=k-i2;
if(j1>=1&&j1<=m&&j2>=1&&j2<=m&&i1!=i2)
{
int &x=f[k][i1][i2],t=w[i1][j1]+w[i2][j2];
x=max(x,f[k-1][i1-1][i2-1]+t);//下下
x=max(x,f[k-1][i1][i2-1]+t);//右下
x=max(x,f[k-1][i1-1][i2]+t);//下右
x=max(x,f[k-1][i1][i2]+t);//右右
}
}
//(n-1,m) (n,m-1)
cout<<f[m+n-1][n][n-1];
//为啥是f[m+n-1][n][n-1]而不是f[n+m][n][n] ?
//因为 i1 不等于 i2 所以无法给 f [n+m][n][n] 赋值
// 由于w[n][n]==0,所以f[m+n-1][n][n-1]也可以
}
275. 传纸条 线性dp 数字三角形模型
最新推荐文章于 2024-07-24 14:54:00 发布