题目:

蒜头君在玩一款逃生的游戏。在一个 n×mn \times mn×m 的矩形地图上,蒜头位于其中一个点。地图上每个格子有加血的药剂,和掉血的火焰,药剂的药效不同,火焰的大小也不同,每个格子上有一个数字,如果格子上的数字是正数说明是一个药剂代表增加的生命值,如果是负数说明是火焰代表失去的生命值。

蒜头初始化有 v 点血量,他的血量上限是 c,任何时刻他的生命值都不能大于血量上限,如果血量为 0 则会死亡,不能继续游戏。

矩形地图上的四个角(1,1),(1,m),(n,1),(n,m) 为游戏的出口。游戏中只要选定了一个出口,就必须朝着这个方向走。例如,选择了左下的出口,就只能往左和下两个方向前进,选择了右上的出口,就只能往右和上两个方向前进,左上和右下方向的出口同理。

如果成功逃生,那么剩余生命值越高,则游戏分数越高。为了能拿到最高分,请你帮忙计算如果成功逃生最多能剩余多少血量,如果不能逃生输出−1。

输入格式

第一行依次输入整数 nn,mm,xx,yy,vv,cc(1<n,m≤1000,1≤x≤n,1≤y≤m,1≤v≤c≤10000nn,mm,xx,yy,vv,cc(1 < n,m \leq 1000,1 \leq x \leq n,1 \leq y \leq m,1 \leq v \leq c \leq 10000nn,mm,xx,yy,vv,cc(1<n,m≤1000,1≤x≤n,1≤y≤m,1≤v≤c≤10000), 其中 n, mn,m 代表地图大小,(x, y)(x,y) 代表蒜头君的初始位置,vv 代表蒜头的初始化血量,cc 代表蒜头的生命值上限。

接下来 nn 行,每行有 mm 个数字,代表地图信息(每个数字的绝对值不大于 100,地图中蒜头君的初始位置的值一定为 0)。

输出格式

一行输出一个数字,代表成功逃生最多剩余的血量,如果失败输出 -1−1。

输出时每行末尾的多余空格,不影响答案正确性

要求使用「文件输入输出」的方式解题,输入文件为 escape.in,输出文件为 escape.out

样例输入

4 4 3 2 5 10
1 2 3 4
-1 -2 -3 -4
4 0 2 1
-4 -3 -2 -1

样例输出

10

分析:

  • 这里需要分开枚举四个方向。
  • 另外还需要处理一个问题,中途,当遇到某个 dp[i][j] 小于等于 0 的时候,把 dp[i][j]赋值为 -inf,可以让这个位置就不会转移出后继状态了。当 dp[i][j]大于 c 的时候需要把 dp[i][j]dp[i][j] 赋值为 c(题目中说:他的血量上限是 c,任何时刻他的生命值都不能大于血量上限)

AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int M=1e3+10;
const int inf=0x3f3f3f3f;
int n,m,x,y,v,c;
int mp[M][M],dp[M][M];
int main(){freopen("escape.in", "r", stdin);freopen("escape.out", "w", stdout);cin>>n>>m>>x>>y>>v>>c;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>mp[i][j];dp[x][y]=v;for(int i=x;i>=1;i--)for(int j=y;j>=1;j--){if(i==x&&j==y) continue;else if(i==x) dp[i][j]=dp[i][j+1]+mp[i][j];else if(j==y) dp[i][j]=dp[i+1][j]+mp[i][j];else dp[i][j]=max(dp[i+1][j],dp[i][j+1])+mp[i][j];if(dp[i][j]<=0)dp[i][j]=-inf;if(dp[i][j]>c)dp[i][j]=c;}for(int i=x;i<=n;i++)for(int j=y;j<=m;j++){if(i==x&&j==y) continue;else if(i==x) dp[i][j]=dp[i][j-1]+mp[i][j];else if(j==y) dp[i][j]=dp[i-1][j]+mp[i][j];else dp[i][j]=max(dp[i-1][j],dp[i][j-1])+mp[i][j];if(dp[i][j]<=0)dp[i][j]=-inf;if(dp[i][j]>c)dp[i][j]=c;}for(int i=x;i<=n;i++)for(int j=y;j>=1;j--){if(i==x&&j==y) continue;else if(i==x) dp[i][j]=dp[i][j+1]+mp[i][j];else if(j==y) dp[i][j]=dp[i-1][j]+mp[i][j];else dp[i][j]=max(dp[i-1][j],dp[i][j+1])+mp[i][j];if(dp[i][j]<=0)dp[i][j]=-inf;if(dp[i][j]>c)dp[i][j]=c;}for(int i=x;i>=1;i--)for(int j=y;j<=m;j++){if(i==x&&j==y) continue;else if(i==x) dp[i][j]=dp[i][j-1]+mp[i][j];else if(j==y) dp[i][j]=dp[i+1][j]+mp[i][j];else dp[i][j]=max(dp[i+1][j],dp[i][j-1])+mp[i][j];if(dp[i][j]<=0)dp[i][j]=-inf;if(dp[i][j]>c)dp[i][j]=c;}int k=max(max(dp[1][1],dp[n][m]),max(dp[1][m],dp[n][1]));if(k<0) cout<<"-1"<<endl;else cout<<k<<endl;return 0;
}

计蒜客 逃生+动态规划相关推荐

  1. 计蒜客--逃生--动态规划入门DP

    建议 :做这道题之前做一下我写的蒜头君回家 例题,这道题就是由蒜头君回家演变来的 题目: 蒜头君在玩一款逃生的游戏.在一个 n×m 的矩形地图上,蒜头位于其中一个点.地图上每个格子有加血的药剂,和掉血 ...

  2. 无脑博士的试管们java_计蒜客 无脑博士和他的试管们

    标签: 无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直 ...

  3. 计蒜客 挑战难题 爬楼梯

    计蒜客 挑战难题 爬楼梯 假设你现在正在爬楼梯,楼梯有n级.每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数. 接下来一行输 ...

  4. 最短路(遍历边)计蒜客—DD坐地铁

    题目: C 城有 n 个站点, m 条双向地铁,每条地铁有一个 companyicompany_icompanyi​表示它的公司,如果连续乘坐同一家公司的地铁只要花 1元钱就好.DD现在想出门找萨摩耶 ...

  5. K - Triangle 计蒜客 - 42405

    K - Triangle 计蒜客 - 42405 题意: 给你一个三角形的三点,再给你三角形边上一个点,让你求另一个点(也要在三角形上),使得平分三角形的面积 题解: 计算几何 三角形的三边ab,ac ...

  6. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

  7. C - Digital Path 计蒜客 - 42397 05-29

    C - Digital Path 计蒜客 - 42397 题意: 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走,而且下一个位置必须比当前位置的数字大1,入口和出口必须数边缘元素, ...

  8. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...

    在人才招聘领域存在这样一个怪圈,高校每年都说是最难就业年.人才过剩,而对于企业HR来说永远都招不到称心如意的人才.这个怪圈在"计蒜客"创始人俞昊然看来,主要是因为当今高校的教学资源 ...

  9. 计蒜客 - T1012 A*B问题

    计蒜客 - T1012 A*B问题 相信你已经学会 A+B 问题了,那么问题又来了- 输入两个正整数 A 和 B ,求 A×B. 输入格式 一行,包含两个正整数 A 和 B,中间用单个空格隔开. 1≤ ...

最新文章

  1. YOLO v1到YOLO v4(下)
  2. Android 获取apk签名的fingerprint
  3. Oracle 11.2 安装Oracle 11.1的HR schoma
  4. cx_sy_dyn_call_illegal_type
  5. eeprom的wp 引脚_EEPROM存储芯片24C02
  6. html内容封装为一个对象_技术赋能还是内容为王,哪一个才是短视频创作的关键?...
  7. CentOS7下解决yum install mysql-server没有可用包的问题
  8. 浏览器的同源策略与跨域问题的解决方案
  9. 面试题:Two Sum
  10. 2021数学建模国赛一等奖经验总结与分享
  11. 电力拖动自动控制系统复习(四)
  12. 最大约数(秋季每日一题 34)
  13. 一个草根前端人的焦虑
  14. ibm邮件怎么撤回_请问LotusNotes具备发出邮件后撤回 – 手机爱问
  15. 防护器件-ESD管知识普及
  16. NTP 时区+时间同步
  17. 2023华为OD面试手撕代码经验分享
  18. 辐射76 服务器位置,《辐射76》确认没有NPC 但将开放私人服务器与MOD
  19. c# 采用XML的方式读取OSM文件
  20. [(1+1)2] ?

热门文章

  1. java之解析DNS的SRV记录
  2. Android之如何解决popupWindow(pw.setFocusable(true))按返回键和menu键退出
  3. 用beyond compare解决git不能同步项目重新下载项目然后就行对比解决冲突
  4. Android之Android Studio 快捷键整理分享
  5. 《看聊天记录都学不会C#?太菜了吧》(2)C#那么简单我为何之前还学C语言?
  6. okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...
  7. 让TA们告诉你,疫情当下如何更彪悍的成长
  8. C语言关系 是行还是列,C语言行优先和列优先的问题深入分析
  9. android sdk中添加自定义api,android SDK中添加自定义api【转】
  10. 网页表格线框html,关于Dreamweaver中怎么让html网页中的table边框细线显示?