您当前的位置: 首页 >  动态规划
  • 1浏览

    0关注

    322博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

动态规划(Dynamic Programming)

森明帮大于黑虎帮 发布时间:2021-10-06 16:25:18 ,浏览量:1

文章目录
  • 一、Dynamic Programming定义
  • 二、斐波那契数列
  • 三、跳台阶扩展问题
  • 四、最大连续子数组和
  • 五、背包问题
      • 1.单词拆分 (字符串分割)
  • 六、三角矩阵(Triangle)
  • 七、路径总数I
  • 八、路径总数II
  • 九、最小路径和(Minimum Path Sum)
  • 十、背包问题
  • 十一、回文串分割最小次数问题
  • 十二、编辑距离
  • 十三、不同的子序列

一、Dynamic Programming定义

动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。

在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。

  • 动态规划具备了以下三个特点:
  • 把原来的问题分解成了几个相似的子问题。
  • 所有的子问题都只需要解决一次。
  • 储存子问题的解。

动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)。

  • 动态规划问题一般从以下四个角度考虑:
  • 状态定义。
  • 状态间的转移方程定义。
  • 状态的初始化。
  • 返回结果。

状态定义的要求:定义的状态一定要形成递推关系。

一句话概括:三特点四要素两本质。

适用场景:最大值/最小值, 可不可行, 是不是,方案个数。

二、斐波那契数列

斐波那契数列 在这里插入图片描述

class Solution {
public:
    int Fibonacci(int n) 
    {
        /*if(n==0||n==1)
        {
            return n;
        }
        else
        {
            return Fibonacci(n-1)+Fibonacci(n-2);
        }*/
        if(n==0||n==1)
        {
            return n;
        }
        int n1=0;
        int n2=1;
        int n3=0;
        while(n>1)
        {
            n3=(n1+n2)%1000000007;
            n1=n2;
            n2=n3;
            n--;
        }
        return n3;
    }
};
三、跳台阶扩展问题

类似pow的求解 在这里插入图片描述

class Solution {
public:
    int jumpFloorII(int number) 
    {
        if(number==0||number==1)
        {
            return number;
        }
        else
        {
            int ret=1;
            while(number>1)
            {
                ret=ret*2;
                number--;
            }
            return ret;
        }
    }
};
四、最大连续子数组和

连续子数组最大和 在这里插入图片描述

class Solution {
public:
    int FindGreatestSumOfSubArray(vector array) 
    {
        if(array.size()==0)
        {
            return 0;
        }
        
        int sum=array[0];
        
        for(int i=0;i            
关注
打赏
1664288938
查看更多评论
0.0611s