Working out
题目链接: CodeForces - 429B
题意:两人贯穿迷宫, 甲由左上角走到右下角, 且只能向下或想右走; 乙由左下角走到右上角, 且只能向上或想右走; 两人只能相遇一次, 走过对应的方格,
得到相应的价值, 问:最后所得最大价值;
思路既然只能相遇一次, 那么相当于在相遇的点向四周走;
#include <iostream>
#include <math.h>
using namespace std;
int dp1[1005][1005], dp2[1005][1005], dp3[1005][1005], dp4[1005][1005], a[1005][1005];
int main(){
int n, m;
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++){
dp1[i][j]=max(dp1[i-1][j], dp1[i][j-1])+a[i][j];
}
}
for(int i=1; i<=n; i++){
for(int j=m; j>=1; j--){
dp2[i][j]=max(dp2[i-1][j], dp2[i][j+1])+a[i][j];
}
}
for(int i=n; i>=1; i--){
for(int j=1; j<=m; j++){
dp3[i][j]=max(dp3[i+1][j], dp3[i][j-1])+a[i][j];
}
}
for(int i=n; i>=1; i--){
for(int j=m; j>=1; j--){
dp4[i][j]=max(dp4[i+1][j], dp4[i][j+1])+a[i][j];
}
}
int ans=0;
for(int i=2; i<n; i++){
for(int j=2; j<m; j++){
ans=max(ans, dp1[i-1][j]+dp2[i][j+1]+dp3[i][j-1]+dp4[i+1][j]);
ans=max(ans, dp1[i][j-1]+dp2[i-1][j]+dp3[i+1][j]+dp4[i][j+1]);
}
}
cout << ans << endl;
return 0;
}