動態規劃簡述-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;i<n;i++)
        {
           int 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;i<nums.size();i++)
            maxN[i]=max(maxN[i-2]+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;i<nums.size();i++)
        {
            if(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.動態規劃題目需多練習,領悟整體概念框架;讓我們一同努力,明天會更好!

發佈了34 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章