- 動態規劃綜述
- leetcode簡單題目
2.1.Climbing Stairs爬樓梯
2.2.House Robber房屋盜竊
2.3.Maximum Subarray連續子數組的最大和 - 總結
一.動態規劃綜述
動態規劃(亦稱表格法):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.動態規劃題目需多練習,領悟整體概念框架;讓我們一同努力,明天會更好!