zoukankan      html  css  js  c++  java
  • DP:0

    小故事

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

    特性

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

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

    DP算法的两种形式

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

    Fibonacci (n) = 1;   n = 0
    Fibonacci (n) = 1;   n = 1
    Fibonacci (n) = Fibonacci(n-1) + Fibonacci(n-2)

    0.递归版本

    public int fib(int n)
    {
        if(n<=0)
            return 0;
        if(n==1)
            return 1;
        return fib( n-1)+fib(n-2);
    }

    递归树

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

     1.自顶向下的备忘录法

    public static int Fibonacci(int n)
    {
            if(n<=0)
                return n;
            int []Memo=new int[n+1];        
            for(int i=0;i<=n;i++)
                Memo[i]=-1;
            return fib(n, Memo);
    }
    public static int fib(int n,int []Memo)
    {
    
            if(Memo[n]!=-1)
                return Memo[n];
        //如果已经求出了fib(n)的值直接返回,否则将求出的值保存在Memo备忘录中。               
            if(n<=2)
                Memo[n]=1;
    
            else Memo[n]=fib( n-1,Memo)+fib(n-2,Memo);  
    
            return Memo[n];
    }

    理解:创建了一个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.自底向上

    public static int fib(int n)
    {
            if(n<=0)
                return n;
            int []Memo=new int[n+1];
            Memo[0]=0;
            Memo[1]=1;
            for(int i=2;i<=n;i++)
            {
                Memo[i]=Memo[i-1]+Memo[i-2];
            }       
            return Memo[n];
    }

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

    public static int fib(int n)
        {
            if(n<=1)
                return n;
    
            int Memo_i_2=0;
            int Memo_i_1=1;
            int Memo_i=1;
            for(int i=2;i<=n;i++)
            {
                Memo_i=Memo_i_2+Memo_i_1;
                Memo_i_2=Memo_i_1;
                Memo_i_1=Memo_i;
            }       
            return Memo_i;
        }

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

    动态规划题集整理

      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维来求解

  • 相关阅读:
    项目Alpha冲刺(团队)-第七天冲刺
    NOIP模拟赛[补档]
    关于补档
    noip2017集训测试赛(三) Problem B: mex [补档]
    初赛准备 [补档]
    记录 [补档]
    Leave It Behind and Carry On ---- 高一下期末考反思 [补档]
    NOIP 2017 赛后反思 [补档]
    囤题 [补档]
    组合游戏学习笔记 [补档]
  • 原文地址:https://www.cnblogs.com/p0pl4r/p/10553897.html
Copyright © 2011-2022 走看看