题目描述

样例:

实现解释:

没想到你也是个刀客塔之二维DP

知识点:

动态规划,多条流水线调度?可以看做一种流水线调度

坑点:

输入内容的调整(*的特殊判定),开头结尾的调整策略

从题意可知,要做的就是从起始点移动到蓝点,并且在过程中会有一个值的记录,这就可以和一些基础题目联系起来:捡金币问题,流水线问题等等。

不过注意在使用板子时需要注意值的调度策略:对无法过去的地点,可将敌人攻击值设为99999,即无限,从而在进行动态规划时也可直接参与计算。借助这一攻击无限化的想法,对第一列和最后一列也需要进行处理:无法从开始点直接进入的第一列的值和无法在最后一列到达结束点,同样是到达无意义(无法上下移动),因此设为无穷。

调整之后便可直接借助dp进行,假设dp数组为dp[i][j]:到达第i行j列时的最小受损值。则很容易可得到状态转移方程:dp[i][j] = min(dp[i][j-1],dp[i-1][j-1],dp[i+1][j-1]) + a[i][j];

基于方程递归进行即可,注意dp的初始化(第一列),这里由于是参考多条流水线进行的编写,因此应该会很熟悉。

完整代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define NO 99999
int a[][];
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin >> n >> m;
int a[n][m];
int dp[n][m];
int h,from,to;
char temp;
cin >> h >> from >> to;
for(int i = ;i<n;i++)
{
for(int j = ;j<=m;j++)
{
cin >> temp;//便于比较是否可通行
if(temp == '*') a[i][j] = NO;//不可通行则设为一定死的值
else a[i][j] = temp-'';//否则存储数字
}
}
from -= ;
to -= ;
//这里是为了和脚标配合进行的处理
for(int i = ;i<n;i++)
{
//第一列中开局不能到达的,最后一列中不能到结束点的
//相当于不可达,设为大值
if(abs(from-i) > ) a[i][] = NO;
if(abs(to-i) > ) a[i][m] = NO;
}
for(int i = ;i<n;i++)
{
//象征性的初始化,第一列
dp[i][] = a[i][];
}
int tempf;//存储临时的掉血数
for(int i = ;i<=m;i++)
{
for(int j = ;j<n;j++)
{
//向右走
tempf = dp[j][i-]+a[j][i];
//判断右上和右下
for(int k = -;k<=;k+=)
{
//越界则跳过
if(j+k<||j+k>n-) continue;
if(tempf > dp[j+k][i-]+a[j][i])
{
tempf = dp[j+k][i-]+a[j][i];
}
}
dp[j][i] = tempf;
}
}
//获取最小值设为最大值
tempf = NO;
for(int k = -;k<=;k++)
{
if(to+k<||to+k>n-) continue;//越界跳过
if(dp[to+k][m] > NO) continue;//有不可达的点,跳过
if(dp[to+k][m] < tempf) tempf = dp[to+k][m];//最小值
}
//判断最小掉血数和hp的关系
if(tempf-h > ) cout << "doctor win\n";
else cout << h-tempf << '\n';
return ;
}

题解:2018级算法第六次上机 C6-危机合约的更多相关文章

  1. 题解:2018级算法第六次上机 C6-不Nan的过河

    题目描述: 样例: 实现解释: 一道因为没排序做了一个小时没做出来的二分答案模板题(手动呲牙) 知识点: 二分答案,最大值最小化 坑点: 排序,judge(mid)函数内计数的实现 其实从最长一步的最 ...

  2. 题解:2018级算法第五次上机 C5-图2

    题目描述: 样例: 实现解释: 所有结点对最短路径的板子题 知识点: 寻找所有结点对最短路径,动态规划 坑点: 无坑,注意建边即可 使用的算法为floyd算法 按照程序顺序解释如下: 首先建图,以邻接 ...

  3. 题解:2018级算法第四次上机 C4-最小乘法

    题目描述: 样例: 实现解释: 和字符串处理结合的动态规划,个人认为比较难分析出状态转移方程,虽然懂了之后挺好理解的 知识点: 动态规划,字符串转数字 题目分析: 首先按照最基础:依据题意设计原始dp ...

  4. 题解:2018级算法第四次上机 C4-商人卖鱼

    题目描述: 样例: 实现解释: 需要简单分析的贪心题 知识点: 贪心,自定义排序,提前存储 题目分析: 卖鱼,鱼卖出去需要时间,鱼没被卖出去之前需要吃饲料 则有,如果卖a鱼的话b鱼会吃饲料c份,而卖b ...

  5. 题解:2018级算法第三次上机 C3-Zexal的浩瀚星辰

    题目描述: 样例: 实现解释: 一道结合了火箭发射的贪心题目 知识点: 贪心,优先队列 题目分析: 根据题目描述可知,延迟后时间是正常推进的,也就是假设共有n个火箭,推迟k小时.则在到达k+1小时时, ...

  6. 2016级算法第六次上机-G.ModricWang likes geometry

    1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码

  7. 2016级算法第六次上机-F.AlvinZH的学霸养成记VI

    1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...

  8. 2016级算法第六次上机-E.Bamboo之吃我一拳

    Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均 ...

  9. 2016级算法第六次上机-A.Bamboo之寻找小金刚

    Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...

随机推荐

  1. Redis PHP扩展安装步骤

    ### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...

  2. Chrome扩展移植到Edge浏览器教程

    微软在推出Edge浏览器之初,就把能够使用扩展(extension)作为一个重要功能.在Win10一周年更新版(1607)中,这项功能正式向广大用户推出(当然,Insider用户早就测试了一段时间了) ...

  3. VMWare的三种网络连接方式

    VMWare和主机的三种网络连接方式 桥接 这种模式下,虚拟机通过主机的网卡与主机通信,如果主机能够上网,则虚拟机也能联网. 在虚拟机中,需要将虚拟机的IP配置为与主机处于同一网段. 虚拟机也可以与同 ...

  4. 【原创】Linux中断子系统(三)-softirq和tasklet

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. PAI-AutoLearning 图像分类使用教程

    概述 PAI AutoLearning(简称PAI AL)自动学习支持在线标注.自动模型训练.超参优化以及模型评估.在平台上只需准备少量标注数据,设置训练时长即可得到深度优化的模型.同时自动学习PAI ...

  6. CSS优先级的两种理解方式

    方式一:值相加 我们先去MDN看看官方的解释: 优先级是如何计算的? 优先级就是分配给指定的 CSS 声明的一个权重,它由 匹配的选择器中的 每一种选择器类型的 数值 决定. 而当优先级与多个 CSS ...

  7. 深入理解React:懒加载(lazy)实现原理

    目录 代码分割 React的懒加载 import() 原理 React.lazy 原理 Suspense 原理 参考 1.代码分割 (1)为什么要进行代码分割? 现在前端项目基本都采用打包技术,比如 ...

  8. ca76a_c++_流文件打开输入输出文件模式p773

    /*ca76a_c++_流文件打开输入输出文件模式利用文件流打开文件进行输入与输出时的选项in.out.app(附加模式).ate((end)文件打开后,定于文件结尾).trunc(裁剪).binar ...

  9. Mysql报错Error Code: 1175. You are using safe update

    使用MySQL执行update的时候报错:Error Code: 1175. You are using safe update mode and you tried to update a tabl ...

  10. redis基础一

    2.修改redis.conf的配置文件有两个地方 a.将daemonize设置成true支持后台启动 b.将redis的数据库文件保存到 下面的目录 3.启动redis服务器 4.操作redis ,给 ...