Rqnoj105 核电站问题 题解

又回到我可爱的Blog了~昨天偷了点懒,一篇文章也没写~今天一定抽时间补上。

下面切入正题。

【题目描述】(rqnoj105)
一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。
任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数
【输入格式】
输入文件只一行,两个正整数N,M( 1<N<50,2≤M≤5)
【输出格式】
输出文件只有一个正整数S,表示方案总数。
【样例输入】
4 3
【样例输出】
13

这是一道线性递推类的动态规划。说实话,这道题我直接看的题解,竟然没有看懂,纠结我一节课…先把代码贴上:

    
1 program nuclear; 2 var 3 f:array[-6..60]of int64; 4 i,m,n:integer; 5 begin 6 readln(n,m); 7 f[0]:=1; 8 f[-1]:=1; 9 for i:=1 to n do 10 f[i]:=2*f[i-1]-f[i-m-1]; 11 writeln(f[n]); 12 end.  

这巨短的代码理解起来还真不容易。首先,f数组存储的是到第f个坑可能出现的情况数。网上很多题解都用到分情况讨论,根据Jingo大牛的无敌思想,只要把数组向前多定m位,即-m到n即可。

另外一个比较纠结的地方就是这个神奇的动态方程。你可以自己分析一下,如果不懂请看下文。

我们先将方程分解,即f[i]:=f[i-1]+f[i-1]-f[i-m-1],这是显而易见的。两个f[i-1]分别代表的是f[i]位上放或者不放。但是f[i]上能放的条件是连续的一排上最多有m-1堆。以样例为例,当i=4时有以下状态:

因为如果在(4)放,在(3)号坑放的前提下(2)一定是不放的。所以要用在f[i-1](3号坑放的那一个)中排除有(2)且有(3)的那种情况。

由题意可知,如果(2)(3)都有核物质,(1)中一定没有。所以能达到图中的的状态的情况数只等于f[0],即f[i-m-1]的值。这时f[i-1]-f[i-m-1]就好理解了。

还有一个问题就是为什么f[0]和f[-1]都初始化为1。这可以从上文很简单的找到答案。因为当i=m(i-m-1=-1)或i=m+1(i-m-1=0)时,需要减去i,i-1,…,i-m+1都有核物质的这一种不符合题意的情况。

现在请把鼠标滚轮向上滚,重新看一遍代码。这是你就可以体会到这段伟大的O(n)的DP代码的魅力了。

(saltless原创,转载请注明出处)

核电站问题转载自saltless原创相关推荐

  1. uniapp:插件Luch_request 修改全局默认配置(转载请标明原创)

    目的是为了方便前端以后修改接口,以下是修改方法. 一.插件市场 导入 luch-request ,导入成功后,根目录有一个文件夹叫 js_sdk ,打开会发现有一个 luch-request 文件夹. ...

  2. KMP(转载来自Matrix67原创)

    转载复制来自:http://blog.163.com/36142114@qq.com/blog/static/168816502201072042753754/ 原作者:牛b的Matrix67(听说是 ...

  3. CREATE TABLE 表名 AS SELECT 语句 创建表(转载的非原创)转载自CSDN

    转载地址: https://blog.csdn.net/u013332981/article/details/81907482 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  4. (部分转载,部分原创)java大数类(2)

    NYOJ 773  开方数 http://acm.nyist.net/JudgeOnline/problem.php?pid=773 1 import java.util.Scanner; 2 3 p ...

  5. 从0开始学习 GitHub 系列之「08.如何发现优秀的开源项目」----转载自stormzhang 原创文章

    之前发过一系列有关 GitHub 的文章,有同学问了,GitHub 我大概了解了,Git 也差不多会使用了,但是 还是搞不清 GitHub 如何帮助我的工作,怎么提升我的工作效率? 问到点子上了,Gi ...

  6. 转载:ZZW原创_rsync同步时由于注释问题引起的@ERROR: chdir failed

    1.需求:A机器同步文件到B机器 2.问题: A机器执行如下命令: [root@sv0379 rsync]# rsync -vzrtopg  --password-file=/usr/local/rs ...

  7. stmt在java中的应用_JDBC技术基础总结转载,非原创

    JDBC的全称是Java DataBase Connectivity,即Java数据库连接.它是一套行业标准的API,可以在Java应用程序中与关系型数据库建立连接,并执行相关操作,例如Oracle, ...

  8. 从0开始学习 GitHub 系列之「05.Git 进阶」----转载自stormzhang 原创文章

    关于 Git 相信大家看了之前一系列的文章已经初步会使用了, 但是关于Git还有很多知识与技巧是你不知道的,今天就来给大家介绍下一些 Git 进阶的知识. 1. 用户名和邮箱 我们知道我们进行的每一次 ...

  9. 从0开始学习 GitHub 系列之「04.向GitHub 提交代码」----转载自stormzhang 原创文章

    之前的这篇文章「从0开始学习 GitHub 系列之「Git速成」」相信大家都已经对 Git 的基本操作熟悉了,但是这篇文章只介绍了对本地 Git 仓库的基本操作,今天我就来介绍下如何跟远程仓库一起协作 ...

最新文章

  1. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(自定义调色板填充色、brewer调色板填充、灰度比例填充)实战(density plot)
  2. 基于Arduino ATmega328人脸识别IOT演示门锁
  3. SAP CK40N常见问题
  4. GDB 调试 Mysql 实战(一)源码编译安装
  5. vs安装 c语言编译环境,Visual Studio Code安装与C/C++开发调试环境搭建
  6. 面试题:Two Sum
  7. matlab按行读文件
  8. 完美数简介及算法分析
  9. realtek 8111E 网卡 修改MAC 地址
  10. Altium Designer20 PCB规则设置
  11. Java研发技术学习路线
  12. linaro根文件系统仓库
  13. Google SEO优化排名常见的三种问题
  14. Python-爬取淘宝搜索结果
  15. LuoguP2472 SCOI2007 蜥蜴
  16. easyui-combobox加载json中对象的属性
  17. DXC Technology推出DXC Bionix™,以大规模提供自动化IT服务
  18. BigDecimal比较建议用compareTo
  19. AR9344中ethernet处理方式分析
  20. IDEA代码颜色字体风格设置

热门文章

  1. 电脑箭头,电脑箭头符号怎么打出来(往返箭头符号图案)
  2. 计算机的的编码多的原因,计算机蓝屏代码0x000003b原因和解决方案
  3. 计算机快捷键大全windows,windows系统常见快捷键大全
  4. 大学物理上复习公式提要
  5. showdoc mysql版_ShowDoc部署手册
  6. 微信JSSDK 签名错误invalid signature排查
  7. Flutter 标签类控件大全Chip
  8. 微信转盘抽奖前端源码(三):移动端浏览器兼容性(12个奖品,指针开始时指向奖品)
  9. 数据资源 | 搞学术,还能不知道这八大调查数据开放平台?
  10. 【原创推荐】 计算机毕业设计之Python+Spark+LSTM电商爬虫 商品推荐系统 商品评论情感分析 电商大数据 电商推荐系统 大数据毕业设计