动态规划基础复习 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 ...
随机推荐
- css三大特性
层叠性: 当多个样式(样式的优先级相同)作用于同一个(同一类)标签时,样式发生了冲突,总是执行后边的代码(后边代码层叠前边的代码).和标签调用选择器的顺序没有关系. 继承性: 文字的大多属性都可以继承 ...
- ArcGIS Engine三维动画开发 来自:http://www.iarcgis.com/?p=826
ArcGIS Engine 三维开发 来自:http://www.iarcgis.com/?p=826 在三维中,经常使用的一个功能就是播放动画,也就是我们要对一条动画轨迹进行播放,而在ArcGIS ...
- sublime text 3(Build 3103)最新注冊码
原来注冊过的sublime text 3近期更新了.没想到原来的注冊码就失效了,只是我找到了最新的注冊码(Build 3103),与大家分享一下(第一个亲測可用). -– BEGIN LICENSE ...
- 信号量学习 & 共享内存同步
刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现 ...
- 【APUE】fork函数
#include <unisth.h> pid_t fork(void) fork函数被调用一次,返回两次.子进程的返回值是0,父进程的返回值是子进程的进程id. fork函数调用一次却返 ...
- Android时时监測手机的旋转角度 依据旋转角度确定在什么角度载入竖屏布局 在什么时候载入横屏布局
一.场景描写叙述: 最近开发中遇到个问题,就是我们在做横竖屏切换的功能时.横竖屏布局是操作系统去感知的,作为开发员没法确定Activity在什么时候载入横屏布局,在什么时候载入竖屏布局.因此为了找到载 ...
- MySQL基础笔记(四) 索引
一.什么是索引 索引(Index),可以看作一个指针,指向表里的数据.当数据库没有索引时,查找信息通常是全表扫描:使用了索引,它就会直接引导到数据在表里的准确物理位置. 优点:索引的主要目的是提高数据 ...
- 运算符与类型转换 mogondb简介
运算符与类型转换 1.运算符 (1)分类 算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符.其他运算符 >.算术运算符: 运算符 描述 + 把两个操作数相加 - 从第一个操作数中减去 ...
- centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了
今天在centos上折腾这块是发现老是訪问页面时,浏览器中提示是200 ok.且訪问html后缀却是正常出现内容. 可是訪问php后缀却返回空白页面,同一时候查看全部的log没有发现不论什么出错信息; ...
- c++中拷贝构造函数,浅拷贝和深拷贝的区别
在C++提供了一种特殊的构造函数,称为拷贝构造函数.拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复 ...