動態規劃 House Robber;Best Time to Buy and Sell Stock

動態規劃,可以看這個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;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章