计算式的计算
最大二维矩阵
传纸条
这是走两次的,走三次的类似
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e2+10;
int num[maxn][maxn];
int n, m;
int dp[maxn][maxn][maxn];
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>num[i][j];
dp[0][1][1] = num[1][1];
for(int i=1; i<=n+m-2; i++){
for(int x1=1; x1<=n; x1++){
for(int x2=1; x2<=n;x2++){
int y1 = i+2-x1;
if(y1<1||y1>m) continue;
int y2 = i+2-x2;
if(y2<1||y2>m) continue;
if(x1 == x2){
dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1][x2]+num[x1][y1]);
if(x1-1>=1&&x2-1>=1){
dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1-1][x2-1]+num[x1][y1]);
}
if(x1-1>=1) dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1-1][x2]+num[x1][y1]);
if(x2-1>=1) dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1][x2-1]+num[x1][y1]);
}
else{
dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1][x2]+num[x1][y1]+num[x2][y2]);
if(x1-1>=1&&x2-1>=1){
dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1-1][x2-1]+num[x1][y1]+num[x2][y2]);
}
if(x1-1>=1) dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1-1][x2]+num[x1][y1]+num[x2][y2]);
if(x2-1>=1) dp[i][x1][x2] = max(dp[i][x1][x2], dp[i-1][x1][x2-1]+num[x1][y1]+num[x2][y2]);
}
}
}
}
cout<<dp[n+m-2][n][n]<<endl;
return 0;
}
/*
4 4
1 -1 -1 -1
-1 10 -1 -1
-1 -1 10 -1
-1 -1 -1 10
*/