• [1673] 迷宫问题

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • Alex的猫咪不小心走进了迷宫,Alex为了心爱的猫咪,决定进入迷宫去解救他的猫咪。

    已知猫咪坐标为(n - 1, m - 1),Alex坐标为(0, 0),Alex只能往下或者往右走,且不能走出迷宫,迷宫的大小为n*m,迷宫每个格子上都有一个数字x,如果x大于0,说明Alex走到这个格子上后,血量增加x;反之血量减少x,要求不论在哪个格子,血量都至少大于等于1,且血量没有上限,问,如果Alex要成功从(0,0)走到(n - 1, m - 1),需要的初始血量最少应该是多少?

  • 输入
  • 先输入 T,说明有T组数据。
    接下来T个case
    每个case上
    输入 n, m(迷宫的大小)(1 <= n, m <= 1000)
    接下来输入迷宫,保证每格都是整型。
    且每个数字绝对值都小于等于100

  • 输出
  • 输出Alex 最小需要的初始血量值。

  • 样例输入
  • 2
    3 3
    2 -1 1
    -1 0 -1
    -1 -1 3
    3 3
    3 -9 7
    -3 -2 -8
    0 -1 0
  • 样例输出
  • 1
    2

题目链接:NBUT 1673

当时周赛那会儿说是DP题……某聚聚几下就A了(膜一下Orz),然而我连学长讲解也没听懂,时隔N个月又回来撸了一发,发现用学长那个DP做不来…………,然后自己在纸上对样例推了下就过了,就是if-else有点多= =……

学长代码好像是逆着推的,我写的是正着推,用结构体记录从起始点到当前点的最低所需血量least和当前最多留下的血now;

先特判起始点,然后对每一个邻接的点都进行判断,选出最低所需血量least最小的前驱点赋值给当前点,然后更新now,看now够不够消耗,够的话就只更新now,不够的话还要把least更新,然后就差不多了。

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<bitset>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=1010;
int pos[N][N];
struct info
{
int least;
int now;
};
info dp[N][N];
int main(void)
{
int tcase,i,j,n,m;
scanf("%d",&tcase);
while (tcase--)
{
scanf("%d%d",&n,&m);
for (i=0; i<n; ++i)
{
for (j=0; j<m; ++j)
scanf("%d",&pos[i][j]);
}
if(pos[0][0]>=0)
dp[0][0].least=1;
else
dp[0][0].least=-pos[0][0]+1;
dp[0][0].now=dp[0][0].least+pos[0][0];
for (i=0; i<n; ++i)
{
for (j=0; j<m; ++j)
{
if(!i&&!j)
continue;
if(!i)
{
dp[i][j]=dp[i][j-1];
if(dp[i][j-1].now+pos[i][j]>=1)
dp[i][j].now+=pos[i][j];
else
{
int dx=-pos[i][j]+1-dp[i][j-1].now;
dp[i][j].least+=dx;
dp[i][j].now=1;
}
}
else if(!j)
{
dp[i][j]=dp[i-1][j];
if(dp[i-1][j].now+pos[i][j]>=1)
dp[i][j].now+=pos[i][j];
else
{
int dx=-pos[i][j]+1-dp[i-1][j].now;
dp[i][j].least+=dx;
dp[i][j].now=1;
}
}
else
{
info a=dp[i-1][j],b=dp[i][j-1];
if(a.now+pos[i][j]>=1)
a.now+=pos[i][j];
else
{
int dx=-pos[i][j]+1-a.now;
a.least+=dx;
a.now=1;
}
if(b.now+pos[i][j]>=1)
b.now+=pos[i][j];
else
{
int dx=-pos[i][j]+1-b.now;
b.least+=dx;
b.now=1;
}
dp[i][j]=a.least<b.least?a:b;
}
}
}
printf("%d\n",dp[n-1][m-1].least);
}
return 0;
}

NBUT 1673 迷宫问题(DP)的更多相关文章

  1. 迷宫类dp整合

    这是迷宫类dp我自己取的名字,通常比较简单,上货 简单模型 数字三角形 状态表示:f[i][j]表示起点第\(i\)行第\(j\)个数最短路径的长度 状态转移:\(f[i][j] = max(f[i ...

  2. UVA 10531 Maze Statistics 迷宫统计 迷宫插头DP 四联通 概率

    题意: 有一个N*M的图,每个格子有独立概率p变成障碍物.你要从迷宫左上角走到迷宫右下角.求每个格子成为一个有解迷宫中的障碍物的概率.N <= 5,M <= 6 分析: 这真是一道好题,网 ...

  3. 牛牛的DRB迷宫(DP、二进制编码器)

    牛牛的DRB迷宫I 链接:https://ac.nowcoder.com/acm/contest/3004/A来源:牛客网 题目描述 牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为'R','D',' ...

  4. ZJUT 1423 地下迷宫(期望DP&高斯消元)

    地下迷宫 Time Limit:1000MS  Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...

  5. BZOJ.2246.[SDOI2011]迷宫探险(DP 记忆化搜索 概率)

    题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在 ...

  6. DP问题大合集

    引入 动态规划(Dynamic Programming,DP,动规),是求解决策过程最优化的过程.20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了 ...

  7. NBUT 1010 魔法少女(DP)

    [1010] 魔法少女 时间限制: 1000 ms 内存限制: 65535 K 问题描述 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙. ...

  8. 51nod 1673 树有几多愁——虚树+状压DP

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...

  9. FZU 2186 小明的迷宫 【压状dp】

    Problem Description 小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫.因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷 ...

随机推荐

  1. [Android Pro] 监听Blutooth打开广播

    <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission a ...

  2. Razor入门

    一.Razor简介Razor不是编程语言,它是一种允许您向网页中嵌入基于服务器的代码的标记语法,也就是可以在html网页中嵌入的写入C#代码,Razor在VS中有自动提示,使用起来会方便一点,如下代码 ...

  3. c++ static及const(开发者在线)

    static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一. ...

  4. pycharm上运行django服务器端、以及创建app方法

     快来加入群[python爬虫交流群](群号570070796),发现精彩内容. 安装Django  下载Django包,解压缩. CMD 进入解压路径下. 执行:python setup.py in ...

  5. p235习题1

  6. 在jsfiddle作在线angular测试,蛮有意思的

    jsfiddle.net 快速学知识,比本地自己弄快,当然,不能用于太复杂的应用啦.. 比如:学到directive的scope继承隔离作用域时,就可以这样弄. scope 可选参数,(布尔值或者对象 ...

  7. UML中的关联关系

    UML中的关联关系其内在意思就是has a 如图:  相对于依赖关系,关联关系在代码中有所体现.上图中的关联关系在代码中体现为       其中water 中将Climate作为其中的属性. 当然,关 ...

  8. Java Hour 24 JDBC

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 虽然现在都不会直接写JDBC 了,但是了解毕竟是需要的.当然这个和ADO.Ne ...

  9. Hierachy Viewer 使用 monitor命令

    使用 Hierachy Viewer 可视化调试工具 Hierachy Viewer 能很方便地在开发者设计,调试和调整界面时,快速定位问题,解决问题,提高开发效率. Hierarchy Viewer ...

  10. 谈谈“色彩空间表示方法”——RGB、YUY2、YUYV、YVYU、UYVY、AYUV

    转自:http://bbs.chinavideo.org/viewthread.php?tid=4143 还可参考http://www.fourcc.org/yuv.php 小知识:RGB与YUV-- ...