动态规划基础复习 By cellur925
结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:)
动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还是我太菜了)。
本篇内容预警:理论知识偏多,warning。
引入:一个沙雕题(IOI1994-数字三角形)
最简单的dp模型,初学者好题。
所以dp到底是啥?可以说,dp是多阶段决策过程的最优化方法。仅就最优化而言,搜索与dp经常干一码事。(dp也常求解方案数)。
在把实际问题划分为dp模型时,我们常用到以下术语。(已经混淆很久)
阶段:每个子问题的求解过程。
状态:(本人经常与阶段弄混)粗糙地说,可以认为是阶段的细化再划分。沙雕题中,就是数塔每层的每一列。
转移:每个最优状态的选取过程
决策:每个最优状态的选取。
而状态转移方程将这几要素有机地进行结合,可以说,思考出转移方程,dp题基本就可拿下。我们思考dp题的目的也就是找出转移方程。
在这里我们作短暂的停留,转移方程常与递推式长的很像。lyd觉得很多人递推和dp傻傻分不清。
我们先给出他的答案:

举个例子
错排问题:这个问题有许多具体的版本,如在写信时将n封信装到n个不同的信封里,有多少种全部装错信封的情况?又比如四人各写一张贺年卡互相赠送,有多少种赠送方法?自己写的贺年卡不能送给自己,所以也是典型的错排问题。
答案:F(n)=(n-1)*(F(n-1)+F(n-2))
怎么得出的呢?参考了一下wikipedia--

所以,lyd又说了--

再进行略微小结(怎么感觉开始大力抄课件..)

例题1 codevs核电站问题
是在序列上的问题,通常我们以下标为状态划分(虽说这是递推)
设f[i]为放到第i个坑位时的方案数。
我们可以分类讨论求解。(没错,oi中许多问题确实可以分类讨论)
显然每个坑位有两种选择:放或是不放。
当i<m,有f[i]=f[i-1]*2
当i==m,有f[i]=f[i-1]*2-1(这里不能再放了,否则会炸)
当i>m,有f[i]=f[i-1]*2-f[i-1-m](减去不能放的方案数)
code
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; int n,m;
ll f[]; int main()
{
scanf("%d%d",&n,&m);
f[]=;
for(int i=;i<=n;i++)
{
if(i<m) f[i]=f[i-]*;
else if(i==m) f[i]=f[i-]*-;
else if(i>m) f[i]=f[i-]*-f[i--m];;
}
printf("%lld",f[n]);
return ;
}
例题2 传纸条/方格取数 详见
https://www.cnblogs.com/nopartyfoucaodong/p/9475438.html
例题3 编辑距离 详见
怎么判断一个题是不是dp?(抄lyd课件大全)




两个条件的进一步解读:


Dp与其他算法
一、贪心

二、记忆化搜索


(好吧课件放完了)
聪明的你,是否对dp有了一些新的认识?
附:dalao推荐 TSOI__Vergil
关于dp的认识->绝世好文
动态规划基础复习 By cellur925的更多相关文章
- 《CSS权威指南》基础复习+查漏补缺
前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- nyist oj 79 拦截导弹 (动态规划基础题)
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 某国为了防御敌国的导弹突击.发展中一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以 ...
- C语言基础复习总结
C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...
- JS基础 复习: Javascript的书写位置
爱创课堂JS基础 复习: Javascript的书写位置复习 js书写位置:body标签的最底部.实际工作中使用书写在head标签内一对script标签里.alert()弹出框.console.log ...
随机推荐
- 碧砚适合佳能328 4452 ICD520 4472 4450 硒鼓4700一体机墨盒4770
- openstack ocata 的cell 和 placement api
The Ocata openstack just released recently. The official docs is not very stable yet. Some key steps ...
- ASP.NET Core 奇淫技巧之动态WebApi
一.前言 接触到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件 ...
- Meteor软件包管理
Meteor 提供数千种开发应用程序,您可以使用社区包. 添加软件包 您可以查看Meteor官方包服务器: 点击这里. 只搜索你需要的包,并在命令提示符窗口中添加它. 例如,想使用 http 包添加到 ...
- Java注释中的@deprecated与源代码中的@Deprecated
用 @Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 其次,请注意标题, ...
- Ubuntu使用adb连接android手机失败unknown的解决的方法
Ubuntu使用adb连接android手机失败unknown的解决的方法 Ubuntu下通过USB数据线连接G11手机后,adb可能无法识别到设备.依照一下步骤能够解决此问题. 1.在termi ...
- hdoj 5093 Battle ships 【二分图最大匹配】
题目:pid=5093" target="_blank">hdoj 5093 Battle ships 题意:给你一个n*m的图,图中有冰山 '# ',浮冰 'o' ...
- 李洪强iOS开发之RunLoop的原理和核心机制
李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...
- Linux常用服务安装部署
1,centos7默认是装有python的,检查python版本的命令 # 检查python版本 : python -V 2,centOS在安装python3以及tab补全功能 下载python3源码 ...
- SetLocalTime API函数设置本地时间(DateTimeToSystemTime函数,把TDateTime转换成TSystemTime)
procedure setLocalDateTime(Value: TDateTime);var lSystemDateTime: TSystemTime;begin DateTimeToSyst ...