设为首页 加入收藏

TOP

Codeforces Round #245 (Div. 1)B 递推DP
2015-07-20 17:47:35 来源: 作者: 【 】 浏览:2
Tags:Codeforces Round #245 Div. 递推

1000 * 1000的图,交点就一个,而且如何相交于一点 画一画就会发现就两种情况,所以首先想到的是可以暴力枚举交点,然后由交点往前推,相交过后两个人继续朝自己目的地前进,所以可以先 暴力枚举 并 递推出每一个点 到这个图的 四个顶点的 最大值,然后根据相交的两种情况取最优的一个即可


int mp[1000 + 55][1000 + 55];

int dp1[1000 + 55][1000 + 55],dp2[1000 + 55][1000 + 55],dp3[1000 + 55][1000 + 55],dp4[1000 + 55][1000 + 55];

int n,m;

void init() {
	memset(mp,0,sizeof(mp));
	memset(dp1,0,sizeof(dp1));
	memset(dp2,0,sizeof(dp2));
	memset(dp3,0,sizeof(dp3));
	memset(dp4,0,sizeof(dp4));
}

bool input() {
	while(cin>>n>>m) {
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",&mp[i][j]);
		return false;
	}
	return true;
}

void cal() {
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			dp1[i][j] = mp[i][j] + max(dp1[i - 1][j],dp1[i][j - 1]);//递推当前点到左边上边顶点大最大值
	for(int i=1;i<=n;i++)
		for(int j=m;j>0;j--)
			dp2[i][j] = mp[i][j] + max(dp2[i - 1][j],dp2[i][j + 1]);//右边上边...
	for(int i=n;i>0;i--)
		for(int j=1;j<=m;j++)
			dp3[i][j] = mp[i][j] + max(dp3[i + 1][j],dp3[i][j - 1]);//左边下边...
	for(int i=n;i>0;i--)
		for(int j=m;j>0;j--)
			dp4[i][j] = mp[i][j] + max(dp4[i + 1][j],dp4[i][j + 1]);//右边下边...
	int ans = 0;
	/*暴力枚举交点,交点就一个*/
	for(int i=2;i
  
   

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA 10054 The Necklace 下一篇HDU 4973 A simple simulation pr..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)