/****************************
   Name:  Best time to sell stock III 
   Date: 01/30/2016
   Author: Hualin Li
   Description: This is the Best time to sell stock III in the C++. 还是DP大法
   做题感想:该题目初看时比I,II还吓人,笔者想了两天才想通这个网上流行的算法答案。
   原则上只要扫一遍vector就可以了,但是分两步进行,第一步顺序扫描,完全是I的做法。
   难理解的是第二步,逆序扫描。这步的作用是找出另一半里面的可能最大值。
   
   值得注意的是,里面很巧妙的运用了一个叫profit的vector来储存sum和sum2,大家只要记住
   一点,顺序扫描后,顺序的最大profit放在了profit(i)中,逆序扫描只是叠加上去而已。
   实在不明白的,搞一个数组来画画就懂了。自己也是在曼哈顿M9摇摇晃晃的公车上才想通的。
   
*****************************/
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        
		int length=prices.size();
		if(length<=1)
			return 0;
		
		int minP=prices[0];
		int sum=INT_MIN;
		vector <int> profit;
		profit.resize(length);
		
		for(int i=1;i<length;i++)
		{
			minP=min(minP,prices[i-1]);
			sum=max(sum,prices[i]-minP);
			//Remember for ith, profit[i] will be the same
			profit[i]=sum;
		}
		//The reverse scan
		int maxP=prices[length-1];
		int sum2=INT_MIN;
		for(int j=length-2;j>=0;j--)
		{
			maxP=max(maxP,prices[j+1]);
			sum2=max(sum2,maxP-prices[j]);
			//To add two sum
			if(sum2>0)
			{
				profit[j]=profit[j]+sum2;
				sum=max(profit[j],sum);
			}
		}
		
		if(sum>0)
		return sum;
	    else
		return 0;
		
    }
};
  
  
回到主页 回到目录