動態規劃,可以看這個http://www.360doc.com/content/13/0601/00/8076359_289597587.shtml
我理解的,就是如果一個方法用遞歸,你發現過程會有重複,比如斐波那契數列,a(n)=a(n-1)+a(n-2),然後就會出現每個被算n次的悲劇(3=1+2,5=2+3,8=3+5,算5的時候3被遞歸了,算8的時候,3被遞歸了,5又遞歸了3,這樣往後算不得了.....),所以採取一種查表的方式,就是做一個狀態空間的表,把這個過程平鋪開。
動態規劃的解法呢,就是要找出來狀態空間和空間之間如何轉移,比如斐波那契,a(n)就是每個解,遞推關係就是轉移,但是和遞歸的區別,就是我在求a(n)的時候,前兩個是已知的,之前被算出來的,a(n)和a(n-1)是分離開的不具有聯繫
可能這麼說理論還是沒什麼用,還是要多做例子。。。目前做的都是leetcode的easy,就放一個House Robber.....這裏的狀態tail[i],是包含第i個數的最大策略。
class Solution {
public:
int rob(vector<int>& nums) {
vector<int> tail(nums.size()+1);
int maxRe=0;
for(int i=0;i<nums.size()+1;i++)
{
switch(i){
case 0:tail[i]=0;break;
case 1:tail[i]=nums[0];break;
case 2:tail[i]=nums[1];break;
default:tail[i]=nums[i-1]+max(tail[i-2],tail[i-3]);
}
maxRe=max(maxRe,tail[i]);
}
return maxRe;
}
};
股票的問題,我選的狀態空間d(i),就是以第i個數爲結尾的前面所有數列最小值:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0;
int StockMin=INT_MAX;
for(int i=0;i<prices.size();i++)
{
StockMin=min(StockMin,prices[i]);
profit=max(profit,prices[i]-StockMin);
}
return profit;
}
};