求关
```cpp
#include<bits/stdc++.h>
using namespace std;
int m,n,f[115][55][55],vis[55][55];
int M(int a,int b,int c,int d){
return max(a,max(b,max(c,d)));
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>vis[i][j];
}
}
for(int l=1;l<=m+n-1;l++){
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(l-i+1<1 || l-j+1<1 || l-i+1>n || l-j+1>n){
continue;
}
f[l][i][j]=M(f[l-1][i-1][j-1]+vis[i-1][l-i+1]+vis[j-1][l-j+1],f[l-1][i][j-1]+vis[i][l-i]+vis[j-1][l-j+1],f[l-1][i-1][j]+vis[i-1][l-i+1]+vis[j][l-j],f[l-1][i][j]+vis[i][l-i]+vis[j][l-j]);
if(i==j)
f[l][i][j]-=vis[i][l-i+1];
}
}
}
cout<<f[n+m-1][m][m];
return 0;
}
by AlexSong @ 2023-08-29 18:47:25
谢谢大佬
by 星弈小朋友 @ 2023-08-29 19:32:43
@[星弈小朋友](/user/536822) 帅哥你的行和列没分,分一下就过了,代码思路还是很棒的
```c
#include<bits/stdc++.h>
using namespace std;
int dp[60][60][60][60],a[60][60];
int main()
{
int m,n;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=n;k++)
{
for(int l=1;l<=m;l++)
{
dp[i][j][k][l]=max({dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]})+a[i][j]+a[k][l];
if(i==k&&l==j) dp[i][j][k][l]-=a[i][j];
}
}
}
}
cout<<dp[n][m][n][m];
return 0;
}
```
by HUY1 @ 2023-10-05 10:44:04
Orz
by 星弈小朋友 @ 2023-10-05 14:02:12