小故事

  1. A * "1+1+1+1+1+1+1+1 =?" *
  2.  
  3. A : "上面等式的值是多少"
  4. B : *计算* "8!"
  5.  
  6. A *在上面等式的左边写上 "1+" *
  7. A : "此时等式的值为多少"
  8. B : *quickly* "9!"
  9. A : "你怎么这么快就知道答案了"
  10. A : "只要在8的基础上加1就行了"
  11. A : "所以你不用重新计算因为你记住了第一个等式的值为8!动态规划算法也可以说是 '记住求过的解来节省时间'"
  12. ---------------------

特性

能采用动态规划求解的问题的一般要具有3个性质:
最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

解题步骤
1.  拆分问题
2.  定义状态(并找出初状态)
3.  状态转移方程

DP算法的两种形式

上面已经知道动态规划算法的核心是记住已经求过的解,记住求解的方式有两种:①自顶向下的备忘录法 ②自底向上。 
举一个最简单的例子:求斐波拉契数列Fibonacci 。

  1. Fibonacci (n) = ; n =
  2. Fibonacci (n) = ; n =
  3. Fibonacci (n) = Fibonacci(n-) + Fibonacci(n-)

0.递归版本

  1. public int fib(int n)
  2. {
  3. if(n<=)
  4. return ;
  5. if(n==)
  6. return ;
  7. return fib( n-)+fib(n-);
  8. }

递归树

很多节点(如fib(2))被执行。

 1.自顶向下的备忘录法

  1. public static int Fibonacci(int n)
  2. {
  3. if(n<=)
  4. return n;
  5. int []Memo=new int[n+];
  6. for(int i=;i<=n;i++)
  7. Memo[i]=-;
  8. return fib(n, Memo);
  9. }
  10. public static int fib(int n,int []Memo)
  11. {
  12.  
  13. if(Memo[n]!=-)
  14. return Memo[n];
  15. //如果已经求出了fib(n)的值直接返回,否则将求出的值保存在Memo备忘录中。
  16. if(n<=)
  17. Memo[n]=;
  18.  
  19. else Memo[n]=fib( n-,Memo)+fib(n-,Memo);
  20.  
  21. return Memo[n];
  22. }

理解:创建了一个n+1大小的数组来保存求出的斐波拉契数列中的每一个值,在递归的时候如果发现前面fib(n)的值计算出来了就不再计算,如果未计算出来,则计算出来后保存在Memo数组中,下次在调用fib(n)的时候就不会重新递归了。比如上面的递归树中在计算fib(6)的时候先计算fib(5),调用fib(5)算出了fib(4)后,fib(6)再调用fib(4)就不会在递归fib(4)的子树了,因为fib(4)的值已经保存在Memo[4]中。

2.自底向上

  1. public static int fib(int n)
  2. {
  3. if(n<=)
  4. return n;
  5. int []Memo=new int[n+];
  6. Memo[]=;
  7. Memo[]=;
  8. for(int i=;i<=n;i++)
  9. {
  10. Memo[i]=Memo[i-]+Memo[i-];
  11. }
  12. return Memo[n];
  13. }

自底向上方法也是利用数组保存了先计算的值,为后面的调用服务。观察参与循环的只有 i,i-1 , i-2三项,因此该方法的空间可以进一步的压缩如下。

  1. public static int fib(int n)
  2. {
  3. if(n<=)
  4. return n;
  5.  
  6. int Memo_i_2=;
  7. int Memo_i_1=;
  8. int Memo_i=;
  9. for(int i=;i<=n;i++)
  10. {
  11. Memo_i=Memo_i_2+Memo_i_1;
  12. Memo_i_2=Memo_i_1;
  13. Memo_i_1=Memo_i;
  14. }
  15. return Memo_i;
  16. }

一般来说由于备忘录方式的动态规划方法使用了递归,递归的时候会产生额外的开销,使用自底向上的动态规划方法要比备忘录方法好。

动态规划题集整理

  1、递推

Recursion Practice                              ★☆☆☆☆          几个初级递推
        Put Apple                                       ★☆☆☆☆

Tri Tiling                                      ★☆☆☆☆          【例题1】
        Computer Transformation                         ★☆☆☆☆          【例题2】
        Train Problem II                                ★☆☆☆☆          
        How Many Trees?                                 ★☆☆☆☆          
        Buy the Ticket                                  ★☆☆☆☆          
        Game of Connections                             ★☆☆☆☆
        Count the Trees                                 ★☆☆☆☆
        Circle                                          ★☆☆☆☆
        Combinations, Once Again                        ★★☆☆☆
        Closing Ceremony of Sunny Cup                   ★★☆☆☆           
        Rooted Trees Problem                            ★★☆☆☆          
        Water Treatment Plants                          ★★☆☆☆           
        One Person                                      ★★☆☆☆
        Relax! It’s just a game                        ★★☆☆☆
        N Knight                                        ★★★☆☆
        Connected Graph                                 ★★★★★          楼天城“男人八题”之一

   2、记忆化搜索

Function Run Fun                                ★☆☆☆☆          【例题3】

FatMouse and Cheese                             ★☆☆☆☆          经典迷宫问题

Cheapest Palindrome                             ★★☆☆☆

A Mini Locomotive                               ★★☆☆☆

Millenium Leapcow                               ★★☆☆☆

Brackets Sequence                               ★★★☆☆          经典记忆化

Chessboard Cutting                              ★★★☆☆          《算法艺术和信息学竞赛》例题

Number Cutting Game                             ★★★☆☆

   3、最长单调子序列

Constructing Roads In JG Kingdom                ★★☆☆☆

Stock Exchange                                  ★★☆☆☆

Wooden Sticks                                   ★★☆☆☆

Bridging signals                                ★★☆☆☆

BUY LOW, BUY LOWER                              ★★☆☆☆         要求需要输出方案数

Longest Ordered Subsequence                     ★★☆☆☆

Crossed Matchings                               ★★☆☆☆

Jack's struggle                                 ★★★☆☆          稍微做点转化

   4、最大M子段和

Max Sum                                         ★☆☆☆☆              最大子段和

Max Sum Plus Plus                               ★★☆☆☆              最大M子段和

To The Max                                      ★★☆☆☆              最大子矩阵

Max Sequence                                    ★★☆☆☆              最大2子段和

Maximum sum                                     ★★☆☆☆              最大2子段和

最大连续子序列                                  ★★☆☆☆              最大子段和

Largest Rectangle in a Histogram                ★★☆☆☆              最大子矩阵变形

City Game                                       ★★☆☆☆              最大子矩阵扩展

Matrix Swapping II                              ★★★☆☆              最大子矩阵变形后扩展

   5、线性模型

Skiing                                          ★☆☆☆☆

Super Jumping! Jumping! Jumping!                ★☆☆☆☆

Milking Time                                    ★★☆☆☆         区间问题的线性模型

Computers                                       ★★☆☆☆         【例题5】

Bridge over a rough river                       ★★★☆☆         【例题6】

Crossing River                                  ★★★☆☆         【例题6】大数据版

Blocks                                          ★★★☆☆

Parallel Expectations                           ★★★★☆         线性模型黑书案例

       6、区间模型

Palindrome                                      ★☆☆☆☆         【例题7】

See Palindrome Again                            ★★★☆☆

       7、背包模型

饭卡                                            ★☆☆☆☆              01背包

I NEED A OFFER!                                 ★☆☆☆☆              概率转化

Bone Collector                                  ★☆☆☆☆              01背包

最大报销额                                      ★☆☆☆☆              01背包

Duty Free Shop                                  ★★☆☆☆              01背包

Robberies                                       ★★☆☆☆              【例题8】

Piggy-Bank                                      ★☆☆☆☆              完全背包

Cash Machine                                    ★☆☆☆☆              多重背包

Coins                                           ★★☆☆☆              多重背包,楼天城“男人八题”之一

I love sneakers!                                ★★★☆☆              背包变形

       8、状态压缩模型

ChessboardProblem                               ★☆☆☆☆              比较基础的状态压缩

Number of Locks                                 ★☆☆☆☆              简单状态压缩问题

Islands and Bridges                             ★★☆☆☆              【例题9】

Tiling a Grid With Dominoes                     ★★☆☆☆              骨牌铺方格 4XN的情况

Mondriaan's Dream                               ★★☆☆☆              【例题10】的简易版

Renovation Problem                              ★★☆☆☆              简单摆放问题

The Number of set                               ★★☆☆☆

Hardwood floor                                  ★★★☆☆              【例题10】二进制状态压缩鼻祖

Tetris Comes Back                               ★★★☆☆              纸老虎题

Bugs Integrated, Inc.                           ★★★☆☆              三进制状态压缩鼻祖

Another Chocolate Maniac                        ★★★☆☆              三进制

Emplacement                                     ★★★☆☆              类似Bugs那题,三进制

Toy bricks                                      ★★★☆☆              四进制, 左移运算高于&

Quad Tiling                                     ★★★☆☆              骨牌铺方格 4XN的情况 利用矩阵优化

Eat the Trees                                   ★★★☆☆              插头DP入门题

Formula 1                                       ★★★☆☆              插头DP入门题

The Hive II                                     ★★★☆☆              插头DP

Plan                                            ★★★☆☆              插头DP

Manhattan Wiring                                ★★★☆☆              插头DP

Pandora adventure                               ★★★★☆              插头DP

Tony's Tour                                     ★★★★☆              插头DP,楼天城“男人八题”之一

Pipes                                           ★★★★☆              插头DP

circuits                                        ★★★★☆              插头DP

Beautiful Meadow                                ★★★★☆              插头DP

I-country                                       ★★★★☆              高维状态表示

Permutaion                                      ★★★★☆              牛逼的状态表示

01-K Code                                       ★★★★☆

Tour in the Castle                              ★★★★★              插头DP(难)

The Floor Bricks                                ★★★★★              四进制(需要优化)

       9、树状模型

Anniversary party                               ★☆☆☆☆              树形DP入门

Strategic game                                  ★☆☆☆☆              树形DP入门

Computer                                        ★★☆☆☆

Long Live the Queen                             ★★☆☆☆

最优连通子集                                    ★★☆☆☆

Computer Network                                ★★☆☆☆

Rebuilding Roads                                ★★★☆☆              树形DP+背包

New Year Bonus Grant                            ★★★☆☆

How Many Paths Are There                        ★★★☆☆

Intermediate Rounds for Multicast               ★★★★☆

Fire                                            ★★★★☆

Walking Race                                    ★★★★☆

Tree                                            ★★★★★              树形DP,楼天城“男人八题”之一

        10、滚动数组优化常见问题

Palindrome                                      ★☆☆☆☆

Telephone Wire                                  ★☆☆☆☆

Gangsters                                       ★☆☆☆☆

Dominoes                                        ★☆☆☆☆

Cow Exhibition                                  ★☆☆☆☆

Supermarket                                     ★★☆☆☆

        11、决策单调性

Print Article                                   ★★★☆☆

Lawrence                                        ★★★☆☆

Batch Scheduling                                ★★★☆☆

K-Anonymous Sequence                            ★★★☆☆

Cut the Sequence                                ★★★☆☆

        12、常用优化

Divisibility                                    ★★☆☆☆        利用同余性质

Magic Multiplying Machine                       ★★☆☆☆        利用同余性质

Moving Computer                                 ★★☆☆☆        散列HASH表示状态

Post Office                                     ★★★☆☆        四边形不等式

Minimizing maximizer                            ★★★☆☆        线段树优化

Man Down                                        ★★★☆☆        线段树优化

So you want to be a 2n-aire?                    ★★★☆☆        期望问题

Expected Allowance                              ★★★☆☆        期望问题

Greatest Common Increase Subseq                 ★★★☆☆        二维线段树优化

Traversal                                       ★★★☆☆        树状数组优化

Find the nondecreasing subsequences             ★★★☆☆        树状数组优化

Not Too Convex Hull                             ★★★★☆        利用凸包进行状态转移

In Action                                       ★★★☆☆        最短路+背包

Search of Concatenated Strings                  ★★★☆☆        STL bitset 应用

        13、其他类型的动态规划

Common Subsequence                              2D/0D

Advanced Fruits                                 2D/0D

Travel                                          2D/1D

RIPOFF                                          2D/1D

Balls                                           2D/1D

Projects                                        2D/1D

Cow Roller Coaster                              2D/1D

LITTLE SHOP OF FLOWERS                          2D/1D

Pearls                                          2D/1D

Spiderman                                       2D/0D

The Triangle                        2D/0D

Triangles                           2D/0D

Magazine Delivery                     3D/0D

Tourist                             3D/0D

Rectangle                           2D/1D

Message                             2D/1D

Bigger is Better                      2D/1D

Girl Friend II                       2D/1D

Phalanx                             2D/1D

Spiderman                           最坏复杂度O(NK),K最大为1000000,呵呵

Find a path                                     3D/1D 公式简化,N维不能解决的问题试着用N+1维来求解

DP:0的更多相关文章

  1. 动态规划 计数型DP:dobra

    令人愉快的单词(dobra)时间限制: 0.1 秒空间限制: 32 MB [问题描述]Lea 在她的一生中碰到过很多单词.其中的很大一部分都使她不愉快.作为补偿,她开始创造一些愉快的单词. Lea 通 ...

  2. poj2533--Longest Ordered Subsequence(dp:最长上升子序列)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 33943   Acc ...

  3. dp:FZU2030括号问题

    http://acm.fzu.edu.cn/problem.php?pid=2030 给出一个字符串,其中包括3种字符: ‘(‘, ‘)’, ‘?’.其中?表示这个字符可以是’(‘也可以是’)’. 现 ...

  4. sdutoj1225--编辑距离(dp:字符串转换)

    编辑距离 nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0 ...

  5. 在ie浏览器,360浏览器下,margin:0 auto;不居中的原因

    转自 http://blog.sina.com.cn/s/blog_6eef6bf60100nn4m.html margin:0 auto:不居中可能有以下两个的原因 没有设置宽度 看看上面的代码,根 ...

  6. DP:树DP

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. 使用font-size:0去掉inline-block元素之间的空隙

    现代浏览器的最新版都支持inline-block,只有该死的ie6.7不支持inline-block,但ie6.7可以通过 display:inline: zoom:1: 来模拟 下面是inline- ...

  8. layui,返回的数据不符合规范,正确的成功状态码 (code) 应为:0

    在使用layui的数据表格绑定数据的时候,出现的一些问题,  "返回的数据不符合规范,正确的成功状态码 (code) 应为:0" 之后在网上也查找的了许多的资料,也去看了官网的文档 ...

  9. 无法安装Java,以下开关中存在错误:“0”

    无法安装Java,以下开关中存在错误:“0”:. 解决方法:以管理员运行

随机推荐

  1. webstocket 聊天

    /** * 初始化socket **/ function initSocket(index_host){//端口号 if( !window.WebSocket ){ console.log(" ...

  2. 微信文档采用第三方方式打开选择qq

    本篇文章主要记录解决: 微信打开文档后,----选择第三方应用打开---选择自己的项目,跳转到--列表选择界面--选择好友---然后返回到最近聊天界面,其中列表选择界面onDestroy的问题. 反编 ...

  3. 从源码安装Node

    [从源码安装Node] Nodejs官网未并提供i686架构的bin,为了在i686架构cpu下使用Nodejs,需要从源码编译. 1../configure 2.make 3.make instal ...

  4. JMeter调试工具--Debug Sampler(转载)

    转载自 http://www.cnblogs.com/fengpingfan Debug Sampler添加路径:[添加 / Sampler / Debug Sampler],面板设置如下: 打开JM ...

  5. Spring知识结构

    课程目标:          1. 回顾                    * 传统的开发模式                    * Struts与Hibernate可以做什么事?       ...

  6. ASP.NET 登录验证 ihttpmoudle

    问题: 1.iis版本不同(IIS7.0,应用程序池采用的是集成模式,换成经典模式才起作用.) 在 IIS 7 以下的版本中,应用以下配置: <system.web> <httpMo ...

  7. swiper轮播的slide高度自适应

    方式1:官方给的属性 autoHeight: true, //高度随内容变化 发现实际没效果 方式2:先定义了一个slide的高度数组, //设置slide父级高度 index为slide的索引 fu ...

  8. sqoop2 缺少 jackson-core-asl-1.8.8.jar 和 jackson-mapper-asl-1.8.8.jar 这两个jar包

    [root@spark2 client]# cat /var/log/sqoop2/localhost.2017-12-22.log 十二月 22, 2017 10:29:17 上午 org.apac ...

  9. NumPy Ndarray 对象

    NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放 ...

  10. springMVC项目部署 服务器启动spring容器报错bean未从类加载器中找到

    bean未从类加载器中找到 警告: Exception encountered during context initialization - cancelling refresh attempt: ...