动态规划简述-leetcode dynampic programming

  1. 动态规划综述
  2. leetcode简单题目
    2.1.Climbing Stairs爬楼梯
    2.2.House Robber房屋盗窃
    2.3.Maximum Subarray连续子数组的最大和
  3. 总结
    一.动态规划综述
    动态规划(亦称表格法):I.①通过子问题的解来求原问题的解;②子问题递归求解;II.子问题具有公共的子子问题;较分治算法的优点为避免了对子子问题的重复求解(表格优势)
    二.leetcode几道简单题目
    2.1.Climbing Stairs爬楼梯
    题目描述:有n阶楼梯,一次只能爬一阶或者两阶,求解爬楼梯方法个数。
    知识点:动态规划
    思路:①问题描述:爬到第n阶梯子的方法(效益)设为f(n)是爬到第n-1阶梯子和爬到第n-2阶梯子的总和②递推公式:f(n)=f(n-1)+f(n-2)③用向量保存前变量值(dp表格)
    代码如下:
class Solution {
public:
    int climbStairs(int n)
    {
    //方法一:递归求解-此方法超时
   /*     if(n==1)
        {
            return 1;
        }
        if(n==2)
        {
            return 2;
        }
        return climbStairs(n-1)+climbStairs(n-2);
    }
    */
    //方法二:dp
       vector<int> sta;
       sta.push_back(1);
        sta.push_back(2);
       for(int i=2;iint temp=sta[i-1]+sta[i-2];
           sta.push_back(temp);
        }
        return sta[n-1];
    }
};

2.2.House Robber房屋盗窃
题目描述:每个房间里面有不同数目的金钱,房屋毗邻,盗窃者不可偷盗连续的两个房屋,求解盗窃最大的金钱数目
知识点:动态规划
思路:①问题描述:盗窃到第n个房屋的最大金钱(效益)设为moneyMax(n)是moneyMax(n-1)与(moneyMax(n-2)+money(n))当中的较大者②递推公式:moneyMax(n)=max(moneyMax(n-1),moneyMax(n-2)+money(n))③用向量保存前变量值(dp)注:money(i)为第i个房屋的金钱数
代码如下:

class Solution {
public:
    int rob(vector<int>& nums) 
    {
        if(!nums.size())
            return 0;
        if(nums.size()==1)
            return nums[0];
        if(nums.size()==2)
            return max(nums[0],nums[1]);
        vector<int> maxN;
      //  int max[nums.size()];
        maxN.resize(nums.size(),0);
        maxN[0]=nums[0];
        maxN[1]=max(nums[1],nums[0]);
        for(int i=2;i2]+nums[i],maxN[i-1]);
        return maxN[nums.size()-1];
    }
};

2.3.Maximum Subarray连续子数组的最大和
题目描述:给定一个数组,求解连续数组的最大和
知识点:动态规划
思路:①问题描述:数组num到第n个结点的最大和子序列(效益)设为max(n)是sum(n)>0与num[n]当中的较大者②递推公式:max=sum(n)>max?num[n];max(n)=sum(n)>max?num[n],maxH(n-1)③更新max值 注:sum(n)为到第n个数之和
代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums)
    {
        int max=INT_MIN;//
        int sum=0;
        for(int i=0;iif(sum>=0)
                sum+=nums[i];
            else
                sum=nums[i];
            max=sum>max?sum:max;
        }
        return max;
    }
};

三.总结
I.动态规划分为以下几个步骤:
3.1.1确定状态集合
3.1.2确定收益
3.1.3收益表示
II.动态规划题目需多练习,领悟整体概念框架;让我们一同努力,明天会更好!

你可能感兴趣的:(leetcode,动态规划,leetcode)