测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25668. 夺取宝石

填空题 中等

题目描述

夺取宝石

题目描述

(注.input()输入函数的括号中不允许添加任何信息)

一个n行n列的网格,表示魔塔。魔塔的每个格子中有一个怪物或一瓶药水。一名勇士,有初始体力值,从魔塔左上角入口的格子进入,到右下角出口的位置夺取宝石,夺取宝石的规则如下:

1、勇士只能从魔塔内走到右下角且每次只能向下或向右走一格;

2、怪物格子中有一个负整数,表示勇士进入该格子后会损失对应体力值;药水格子中有一个正整数,表示勇士进入该格子后,会增加对应体力值;

例如:怪物格子中的负整数为 -4 时,表示勇士进入该格子后,会损失 4体力值;药水格子中的正整数为2时,表示勇士进入该格子后,会增加 2 体力值。

3、夺取宝石全程,勇士须保持体力值大于0,否则夺取宝石失败。给定 n行n列的魔塔,请计算勇士最少需要多少初始体力值才可以成功夺取宝石。

给定n行n列的魔塔,请计算勇士最少需要多少初始体力值才可以成功夺取宝石。

例如:n=3;3行3列的魔塔如下:

按照 -1、2、-4、2、-2 的路线,当勇士初始体力值为 4时;

第一步:勇士进入-1格子,损失1体力值,体力值变为3;

第二步:勇士接着进入2格子,增加2体力值,体力值变为 5;

第三步:勇士接着进入-4格子,损失4体力值,体力值变为 1;

第四步:勇士接着进入2格子,增加2体力值,体力值变为 3;

第五步:勇士接着进入-2格子,损失2体力值,体力值变为 1。

勇士成功夺取宝石,且全程体力值均大于0,最少需要 4初始体力值。

输入描述

第一行输入一个整数n(2≤n≤200),表示魔塔的行数和列数接下来输入n行,每行n个整数(-1000≤整数≤1000,整数不能为 ,其中负整数表示勇士进入该怪物格子会损失的体力值,正整数表示勇士进入该药水格子会增加的体力值,整数之间以一个空格隔开

输出描述

输出一个整数,表示勇士最少需要的初始体力值

样例输入

3
-1 1-6
2 -4 1
-5 2 -2

样例输出

4

参考答案

n = int(input()) grid = [list(map(int,input().split())) for i in range(n)] dp = [[0] * n for i in range(n)] dp[-1][-1] = max(1, 1 - grid[-1][-1]) # 初始化最后一行和最后一列 for i in range(n - 2, -1, -1): dp[i][-1]=max(1, dp[i + 1][-1] - grid[i][-1]) dp[-1][i]=max(1, dp[-1][i + 1] - grid[-1][i]) # 填充剩余的格子 for i in range(n - 2, -1, -1): for j in range(n -2, -1, -1): min_health = min(dp[i + 1][j], dp[i][j + 1]) dp[i][j]= max(1, min_health - grid[i][j]) print(dp[0][0])

答案解析

勇士只能向下向右移动,需要计算最少初始体力值。我们可以使用倒推的方法。从出口开始记录走到每个格子所需最少体力值,使用动态规划。

以题目样例来讲,从最右下角开始倒推。右下角值为-2,则最少体力值为3,上面格子的值为1,则需要最小体力值为2,依次类推。

首先完成最后一列和最后一行dp表:

0 0 8

0 0 2

6 1 3

接下来补充完整dp表:

4 4 8

3 5 2

6 1 3

所以最小初始体力值为4。

上一题 下一题