题目描述

样例:

实现解释:

没想到你也是个刀客塔之二维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. C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!(应该是全网第一篇)

    一:背景 1. 讲故事 好消息,.NET 5.0 终于在2020年6月10日发布了第五个预览版,眼尖的同学一定看到了在这个版本中终于支持了 C# 9.0,此处有掌声,太好了!!! .Net5官方链接 ...

  2. [每日一题2020.06.09] leetcode #97 交错字符串 dp

    题目链接 利用动态规划的思想, 对于每种状态(i, j)来说都有(i-1, j) 和 (i,j-1) 需要注意的问题 : 初始化的问题,先把i=0和j=0的状态都初始化后才可以进行dp否则发生数组越界 ...

  3. Spark文档阅读之一:Spark Overview

    Document: https://spark.apache.org/docs/latest/index.html 版本:2.4.5   1. spark的几种执行方式 1)交互式shell:bin/ ...

  4. linux配置SVN服务

    在linux下配置SVN库,网上找到不少教程,但是对于有几个容易混淆的地方需要记录下, 1.在创建SVN文档库的时候,需要使用svn命令先创建出来, svnadmin create /home/svn ...

  5. snprintf和sprintf区别分析

    目录[-] snprintf函数的返回值 snprintf函数的字符串缓冲 今天在项目中使用snprintf时遇到一个比较迷惑的问题,追根溯源了一下,在此对sprintf和snprintf进行一下对比 ...

  6. 如何下载 Ubuntu 镜像文件?

    Ubuntu,是一款基于 Debian Linux 的以桌面应用为主的操作系统,内容涵盖文字处理.电子邮件.软件开发工具和 Web 服务等,可供用户免费下载.使用和分享. 但是对于国内的用户来说如果直 ...

  7. JDK8--07:并行流与串行流

    JDK8中,提供了并行流和串行流,使用parallel()和sequential()来处理,parallel()为并行流sequential()为串行流,两者可以相互转换,以最后一个为准 LongSt ...

  8. JDK8--01:JDK8简介

    一.新特性1.lambda表达式(重点)2.函数式接口3.方法引用与构造器引用4.Stream API(重点)5.接口中的默认方法和静态方法6.新时间日期API7.其他新特性 二.特点: 1.速度更快 ...

  9. C++的新手入门答疑

    基本部分: .ctrl+f5 调试不运行,会出现press anykey to continue f5 调试 .c++变c,修改Stdafx.h,将#include<stdio.h>替换为 ...

  10. 机器学习之KNN算法(分类)

    KNN算法是解决分类问题的最简单的算法.同时也是最常用的算法.KNN算法也可以称作k近邻算法,是指K个最近的数据集,属于监督学习算法. 开发流程: 1.加载数据,加载成特征矩阵X与目标向量Y. 2.给 ...