EOJ 3281 找不到路哒ultmaster 动态规划

3281. 找不到路哒 ultmaster

Time limit per test: 3.0 seconds

Memory limit: 256 megabytes

中华大地上,人人都知道有一个叫做 ultmaster 的 dalao。这倒不是因为他在器乐领域、作曲领域、算法竞赛领域与机器学习领域都已经臻至化境,而是因为他实在是太萌了。

他总是喜欢到世界各处探险,可是呢遗憾的是总有那么些地方不仅难走还危机丛生。

这一次,他来到了一个 mn 列的迷宫,迷宫中有的格子里有可以增加寿元的草药,有的空空如也,有的却有减少寿元的毒气(???)。增加寿元的草药当然要吃,减少寿元的毒气却也不得不吸。在进迷宫之前,ultmaster 拥有的寿元为 h。要保证不能有任何一个时刻寿元值小于 0 (不包括 0),不然 ultmaster 就会死在路上。

迷宫的入口在左上角,出口在右下角,由于 ultmaster 方位感惊人,他竟然能保证自己只往右或者往下走。

那么问题来了,从迷宫出去之后,ultmaster 最多能剩多少寿元呢?


Input

第一行三个整数 m,n,h(1m,n1 000,1h105)

接下来的 m 行,每行 n 个整数,分别代表 ultmaster 在相应格子中将要改变的寿元(即这个整数大于 0 为上述的格子内有草药的情况,等于 0 为上述的格子内空空如也的情况,小于 0 为上述的格子内有毒气的情况),每个整数绝对值不超过 100,整数的绝对值表示对寿元产生的影响(即增加或减少的数目)。

Output

输出一行一个整数表示答案。

如果 ultmaster 一定会死在路上,输出 1

Examples

Input
2 2 1
0 2
2 -3
Output
0
Input
2 2 1
0 2
4 -3
Output
2
Input
2 3 1
0 -1 0
0 -3 0
Output
0
Input
2 2 1
0 -2
-2 3
Output
-1
Input
2 2 9
-1 -2
-3 -4
Output
2
0

动态规划,建立二维数组存储到这个位置还剩多少寿元。显然,dp[i][j]=max(dp[i-1][j], dp[i][j-1]),但是,当一个位置的左侧和上侧的寿元都为负数时,这个位置是无法到达的,这时,我们要将这个位置也置为负数。

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int dp[1001][1001];
	int x, y, l;
	cin>>x>>y>>l;
	for(int i=0; i<=x; i++) dp[i][0]=-101;
	for(int j=0; j<=y; j++) dp[0][j]=-101;//将这些位置置为小于迷宫中最小数的数,以便比较
	for(int i=1; i<=x; i++) for(int j=1; j<=y; j++) cin>>dp[i][j];
	dp[1][1]+=l;
	for(int i=1; i<=x; i++) for(int j=1; j<=y; j++)
	{
		if(i==1 && j==1) continue;
		else
		{
			if(dp[i-1][j]<0 && dp[i][j-1]<0) dp[i][j]=-1;
			else dp[i][j]+=max(dp[i-1][j], dp[i][j-1]);
		}
	}
	if(dp[x][y]<0) cout<<-1<<endl;
	else cout<<dp[x][y]<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值