CodeForces - 429B 简单dp

题目链接 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值