首页 > 代码库 > [LeetCode]Best Time to Buy and Sell Stock III 动态规划

[LeetCode]Best Time to Buy and Sell Stock III 动态规划

本题是Best Time to Buy and Sell Stock/的改进版。

本题中,可以买最多买进卖出两次股票。

买两次股票可以看成是第0~i天买进卖出以及第i+1~n-1天买进卖出两部分。这要枚举i并求出0th~ith的最大利益与(i+1)th~(n-1)th的最大利益之和的最大值就是买进卖出两次可以得到的最大利益。即状态转移方程:

dp[0,n-1]=max{dp[0,k]+dp[k+1,n-1]},k=1,...,n-2

而只买进卖出一次的最大利润通过0th~ith可以求得。


这里求(i+1)th~(n-1)th的最大利润可以由右向左遍历的方法实现。

class Solution {
public:
	int maxProfit(vector<int> &p) {
		int n=p.size(),i,j;
		if(n<=1)return 0;
        int *le=new int[n],*ri=new int[n];
		memset(le,0,sizeof(int)*n);
		memset(ri,0,sizeof(int)*n);
		int minv=p[0];
		for(i=1;i<n;++i){
			if(p[i]-minv>0)le[i]=p[i]-minv;
			if(le[i]<le[i-1])le[i]=le[i-1];
			if(minv>p[i])minv=p[i];
		}
		int maxv=p[n-1];
		for(i=n-2;i>=0;--i){
			if(maxv-p[i] >0)ri[i]=maxv-p[i];
			if(ri[i]<ri[i+1])ri[i]=ri[i+1];
			if(maxv<p[i])maxv=p[i];
		}
		maxv=le[n-1];
		for(i=1;i<n-2;++i){
			if(le[i]+ri[i+1]>maxv)maxv=le[i]+ri[i+1];
		}
		return maxv;
    }
};


[LeetCode]Best Time to Buy and Sell Stock III 动态规划