360网站地图怎么做,免费建立微信网站,从百万到千万 网站怎么优化,百度上做广告怎么收费题目分析
题目描述的已经十分清楚了#xff0c;不做过多阐述 算法原理
状态表示
我们假设第i天的最大利润是dp[i] 我们来画一下状态机 有两个状态#xff0c;买入后和卖出后#xff0c;我们就可以使用两个dp表来解决问题
f[i]表示当天买入后的最大利润
g[i]表示当天卖出…题目分析
题目描述的已经十分清楚了不做过多阐述 算法原理
状态表示
我们假设第i天的最大利润是dp[i] 我们来画一下状态机 有两个状态买入后和卖出后我们就可以使用两个dp表来解决问题
f[i]表示当天买入后的最大利润
g[i]表示当天卖出后的最大利润 状态转移方程
由状态机可以看出
买入后当天如果不卖出最大利润为前一天买入的最大利润f[i-1]
同理卖出后当天如果不买入最大利润为前一天卖出后的最大利润g[i-1]
如果前一天处于买入状态当天卖出最大利润为f[i-1]p[i],
同理如果前一天处于卖出状态当天买入最大利润为g[i-1]-p[i] f[i]max(f[i-1],g[i-1]-prices[i-1]); g[i]max(g[i-1],f[i-1]prices[i-1]); 初始化
f[0]初始化为-p[0]
在第 0 天买入股票这时候利润是 -prices[0]。
g[0]初始化为0,
在第 0 天不持有股票这时候利润是 0因为我们还没有进行任何操作。
填表
必须从左向右填写需要与当天的股票价格相匹配
确定返回值
结合题目要求状态要求
本题返回g[n]
解法
class Solution {
public:int maxProfit(vectorint prices) {//创建dp表//初始化//填表//返回值int nprices.size();vectorint f(n1);auto gf;f[0]-prices[0];for(int i1;in;i){f[i]max(f[i-1],g[i-1]-prices[i-1]);g[i]max(g[i-1],f[i-1]prices[i-1]);}return g[n];}
};