动态规划 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;
    }
};



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