题目链接 https://cn.vjudge.net/problem/CodeForces-429B
题意:给定一个n*m的矩阵,一个人从(1,1)出发,终点为(n,m),只能往下,右走,另一个人从(n,0)出发,终点为(0,m),只能往上,右走,两条路径有且只能有一个交点,且在交点处的值不算入答案,求两条路径的权值和的最大值为多少。
思路:用四个数组分别保存左上至右下,右下至左上,左下至右上,右上至左下的最大值,然后枚举交点求答案。注意经过任意一个可行的交点都能有两种方式,同时边界上的点不能作为交点。
#include <iostream>
using namespace std;
int a[1010][1010], ul[1010][1010], ur[1010][1010], dl[1010][1010], dr[1010][1010];
inline int max(int a,int b) { return a > b ? a : b; }
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n, m, ans = -1;
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)
ul[i][j] = a[i][j] + max(ul[i-1][j],ul[i][j-1]);
for(int i = 1; i <= n; ++i)
for(int j = m; j >= 1; --j)
ur[i][j] = a[i][j] + max(ur[i-1][j],ur[i][j+1]);
for(int i = n; i >= 1; --i)
for(int j = 1; j <= m; ++j)
dl[i][j] = a[i][j] + max(dl[i+1][j],dl[i][j-1]);
for(int i = n; i >= 1; --i)
for(int j = m; j >= 1; --j)
dr[i][j] = a[i][j] + max(dr[i+1][j],dr[i][j+1]);
for(int i = 2; i < n; ++i)
for(int j = 2; j < m; ++j){
ans = max(ans, ul[i-1][j] + dr[i+1][j] + dl[i][j-1] + ur[i][j+1]);
ans = max(ans, ul[i][j-1] + dr[i][j+1] + dl[i+1][j] + ur[i-1][j]);
}
cout<<ans<<'\n';
return 0;
}