[LeetCode]Best Time to Buy and Sell Stock III

class Solution {
//Let f[i][j] to be the maximum sum of j segments from the first i numbers, where the last element we choose is a[i]. 
//We have two strategies to achieve it:
//
//1.Choosing the optimal j-1 segments from the first k numbers, and starting a new segment with a[i]:
//f[i][j] = f[k][j-1] + a[i], where j-1 <= k <= i-1.
//let g[j-1] = max(f[k][j-1])
//2.Appending a[i] to the last segment in the first i-1 numbers
//f[i][j] = f[i-1][j] + a[i].
public:
	int getMaxProfitDP(vector<int> &prices, int transNum)
	{
		vector<int> f(transNum+1, 0);
		vector<int> g(transNum+1, 0);
		for (int i = 1; i < prices.size(); ++i)
		{
			int diff = prices[i]-prices[i-1];
			int m = min(i, transNum);//if not enough to complete transNum transactions
			for (int j = m; j >= 1; --j)
			{//why scan m->1, because we can not
			 //let cur diff accumulate, note: g[j-1] 
				f[j] = max(f[j], g[j-1])+diff;//1.g[j-1] starting a new segment and 2.f[j] Appending a[i] to the last segment
				g[j] = max(g[j], f[j]);//record
			}
		}
		int ans = 0;
		for(int i = 1; i <= transNum; ++i)
			ans = max(ans, g[i]);
		return ans;
	}
	int maxProfit(vector<int> &prices) {
		return getMaxProfitDP(prices, 2);
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值