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

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

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

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

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

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

输出格式

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

样例输入


- - - -

- - - -

样例输出


这里需要分开枚举四个方向。而我们可以通过方向变量来控制方向,这是一个小技巧。可以减少代码量。

另外还需要处理一个问题,中途,当遇到某个dp[i][j]小于等于0的时候,把dp[i][j]赋值为−INF,可以让这个位置就不会转移出后继状态了(就算转移了也没效果)。

当dp[i][j]大于c的时候需要把dp[i][j]赋值为c(题目要求)。

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std; int G[][];
int dp[][];
int TX[]={-,-,,};
int TY[]={-,,-,}; int main()
{
int n,m,sx,sy,v,c;
scanf("%d %d %d %d %d %d",&n,&m,&sx,&sy,&v,&c);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
scanf("%d",&G[i][j]);
}
for(int k=;k<;k++)//控制方向
{
for(int i=sx;i>&&i<=n;i+=TX[k])
{
for(int j=sy;j>&&j<=m;j+=TY[k])
{
if(i==sx&&j==sy) dp[i][j]=v;
else if(i==sx) dp[i][j]=min(c,dp[i][j-TY[k]]+G[i][j]);
else if(j==sy) dp[i][j]=min(c,dp[i-TX[k]][j]+G[i][j]);
else dp[i][j]=min(c,max(dp[i-TX[k]][j],dp[i][j-TY[k]])+G[i][j]);
if(dp[i][j]<=) dp[i][j]=-INF;
}
}
}
int ans=max(max(dp[][],dp[][m]),max(dp[n][],dp[n][m]));
printf("%d\n",ans<=? -:ans);
return ;
}

-

最新文章

  1. bzoj4325: NOIP2015 斗地主(爆搜+模拟)
  2. Atitti &#160;onvif 设备发现与原理
  3. 【Python基础学习二】定义变量、判断、循环、函数基本语法
  4. win10 服务(系统默认服务)注册表
  5. 【转】wireshark过滤规则
  6. 1136. Parliament(二叉树)
  7. Unity3d Shader开发(三)Pass(Fog )
  8. sencha touch中用来格式化日期的字符串参数
  9. Java程序员应该知道的10个面向对象理论
  10. C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
  11. 第三课3、ROS的launch文件
  12. 微信小程序之获取验证码js
  13. Windows 2012 安装 SQL Server 2012,.Net Framework 3.5安装不成的解决办法
  14. Java架构师技能发展脑图
  15. vs链接错误解决方法
  16. Pyhon全栈之路----数据类型
  17. Mysql连接错误:Mysql Host is blocked because of many connection errors
  18. 浅谈java构建工具的选择
  19. phoenix技术(安装部署和基本使用)讲解
  20. ES6之对象的简洁表示法

热门文章

  1. Java 的 String.split 函数,消除空字符串
  2. leetcode617 Merge Two Binary Trees
  3. 吴裕雄--天生自然java开发常用类库学习笔记:foreach及Enumeration接口
  4. Easy Climb UVA - 12170 滚动dp +离散化+ 单调队列优化
  5. 05 MySQL数据类型的选择与使用
  6. 对状态字的理解 尤其是 首次检测位“/FC”的想法
  7. 活动目录对象属性批量修改工具------ADModify
  8. NumPy 排序、查找、计数
  9. Day 17:缓冲输出字符流和用缓冲输入输出实现登录、装饰者设计模式
  10. 每天一点点之vue框架开发 - vue组件之间传值(父向子传值)