首页 > 代码库 > [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 动态规划
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。