当前位置: 首页 > news >正文

网站建设是永久性的吗河北seo基础

网站建设是永久性的吗,河北seo基础,昆明学校网站建设,兰州网站建设chengday49123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组123.买卖股票的最佳时机III …

day49

      • 123.买卖股票的最佳时机III
        • 1.确定dp数组以及下标的含义
        • 2.确定递推公式
        • 3.dp数组如何初始化
        • 4.确定遍历顺序
        • 5.举例推导dp数组
      • 188.买卖股票的最佳时机IV
        • 1.确定dp数组以及下标的含义
        • 2.确定递推公式
        • 4.dp数组如何初始化
        • 4.确定遍历顺序
        • 5.举例推导dp数组

123.买卖股票的最佳时机III

题目链接
解题思路: 关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。

动规五部曲

1.确定dp数组以及下标的含义

一天一共就有五个状态,

  • 没有操作 (其实我们也可以不设置这个状态)
  • 第一次持有股票
  • 第一次不持有股票
  • 第二次持有股票
  • 第二次不持有股票

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

需要注意:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票
例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。

2.确定递推公式

达到dp[i][1]状态,有两个具体操作:

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);

同理dp[i][2]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

同理可推出剩下状态部分:

dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

3.dp数组如何初始化

第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0;

第0天做第一次买入的操作,dp[0][1] = -prices[0];

第0天做第一次卖出的操作,这个初始值应该是多少呢?

此时还没有买入,怎么就卖出呢? 其实大家可以理解当天买入,当天卖出,所以dp[0][2] = 0;

第0天第二次买入操作,初始值应该是多少呢?应该不少同学疑惑,第一次还没买入呢,怎么初始化第二次买入呢?

第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后再买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。

所以第二次买入操作,初始化为:dp[0][3] = -prices[0];

同理第二次卖出初始化dp[0][4] = 0;

4.确定遍历顺序

从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

5.举例推导dp数组

以输入[1,2,3,4,5]为例
在这里插入图片描述
大家可以看到红色框为最后两次卖出的状态。

整体代码如下:

class Solution {
public:int maxProfit(vector<int>& prices) {if (prices.size() == 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(5, 0));dp[0][1] = -prices[0];dp[0][3] = -prices[0];for (int i = 1; i < prices.size(); i++) {dp[i][0] = dp[i - 1][0];dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);}return dp[prices.size() - 1][4];}
};

188.买卖股票的最佳时机IV

题目链接
解题思路:
动规五部曲如下

1.确定dp数组以及下标的含义

在动态规划:123.买卖股票的最佳时机III 中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。

使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]

j的状态表示为:

  • 0 表示不操作
  • 1 第一次买入
  • 2 第一次卖出
  • 3 第二次买入
  • 4 第二次卖出

题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。
所以二维dp数组的C++定义为:

vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));

2.确定递推公式

还要强调一下:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区。

达到dp[i][1]状态,有两个具体操作:

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);

同理dp[i][2]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

同理可以类比剩下的状态,代码如下:

for (int j = 0; j < 2 * k - 1; j += 2) {dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
}

本题和动态规划:123.买卖股票的最佳时机III 最大的区别就是这里要类比j为奇数是买,偶数是卖的状态。

4.dp数组如何初始化

第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0;

第0天做第一次买入的操作,dp[0][1] = -prices[0];

第0天做第一次卖出的操作,这个初始值应该是多少呢?

此时还没有买入,怎么就卖出呢? 其实大家可以理解当天买入,当天卖出,所以dp[0][2] = 0;

第0天第二次买入操作,初始值应该是多少呢?应该不少同学疑惑,第一次还没买入呢,怎么初始化第二次买入呢?

第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后在买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。

所以第二次买入操作,初始化为:dp[0][3] = -prices[0];

第二次卖出初始化dp[0][4] = 0;

所以同理可以推出dp[0][j]当j为奇数的时候都初始化为 -prices[0]

代码如下:

for (int j = 1; j < 2 * k; j += 2) {dp[0][j] = -prices[0];
}

在初始化的地方同样要类比j为偶数是卖、奇数是买的状态。

4.确定遍历顺序

从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

5.举例推导dp数组

以输入[1,2,3,4,5],k=2为例。
在这里插入图片描述
最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。

C++代码如下:

class Solution {
public:int maxProfit(int k, vector<int>& prices) {if (prices.size() == 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));for (int j = 1; j < 2 * k; j += 2) {dp[0][j] = -prices[0];}for (int i = 1;i < prices.size(); i++) {for (int j = 0; j < 2 * k - 1; j += 2) {dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);}}return dp[prices.size() - 1][2 * k];}
};

文章转载自:
http://supranationalism.rqjL.cn
http://interoffice.rqjL.cn
http://astrographic.rqjL.cn
http://incorrigible.rqjL.cn
http://snowshoe.rqjL.cn
http://passel.rqjL.cn
http://strontic.rqjL.cn
http://oilily.rqjL.cn
http://illegitimation.rqjL.cn
http://stovepipe.rqjL.cn
http://recidivist.rqjL.cn
http://lease.rqjL.cn
http://sitting.rqjL.cn
http://unwholesome.rqjL.cn
http://incrustation.rqjL.cn
http://viewdata.rqjL.cn
http://chinkerinchee.rqjL.cn
http://gryke.rqjL.cn
http://leander.rqjL.cn
http://dementia.rqjL.cn
http://unlink.rqjL.cn
http://twosome.rqjL.cn
http://born.rqjL.cn
http://brick.rqjL.cn
http://had.rqjL.cn
http://qishm.rqjL.cn
http://nonbelligerency.rqjL.cn
http://cenobian.rqjL.cn
http://tonetics.rqjL.cn
http://siege.rqjL.cn
http://preset.rqjL.cn
http://crazed.rqjL.cn
http://reign.rqjL.cn
http://pukras.rqjL.cn
http://plowing.rqjL.cn
http://selah.rqjL.cn
http://gravitas.rqjL.cn
http://bevel.rqjL.cn
http://bergamasque.rqjL.cn
http://samfu.rqjL.cn
http://anepigraphic.rqjL.cn
http://ossian.rqjL.cn
http://gloam.rqjL.cn
http://fathead.rqjL.cn
http://prop.rqjL.cn
http://rafvr.rqjL.cn
http://ideally.rqjL.cn
http://livingstone.rqjL.cn
http://daintiness.rqjL.cn
http://hyphal.rqjL.cn
http://acquisition.rqjL.cn
http://extrema.rqjL.cn
http://marlaceous.rqjL.cn
http://rotamer.rqjL.cn
http://aluminise.rqjL.cn
http://roquesite.rqjL.cn
http://sickee.rqjL.cn
http://tart.rqjL.cn
http://significance.rqjL.cn
http://glad.rqjL.cn
http://hide.rqjL.cn
http://eumaeus.rqjL.cn
http://dypass.rqjL.cn
http://rubbings.rqjL.cn
http://brownness.rqjL.cn
http://bimanous.rqjL.cn
http://tristesse.rqjL.cn
http://befittingly.rqjL.cn
http://passive.rqjL.cn
http://mucin.rqjL.cn
http://assonance.rqjL.cn
http://accidental.rqjL.cn
http://sagitta.rqjL.cn
http://bungie.rqjL.cn
http://incinerate.rqjL.cn
http://profaneness.rqjL.cn
http://slow.rqjL.cn
http://weakly.rqjL.cn
http://sichuan.rqjL.cn
http://caesious.rqjL.cn
http://rifty.rqjL.cn
http://submergence.rqjL.cn
http://regelate.rqjL.cn
http://pathognomonic.rqjL.cn
http://outmoded.rqjL.cn
http://bibliomancy.rqjL.cn
http://lichenous.rqjL.cn
http://suffrage.rqjL.cn
http://pioneer.rqjL.cn
http://grandmotherly.rqjL.cn
http://resinography.rqjL.cn
http://orangy.rqjL.cn
http://terrify.rqjL.cn
http://benadryl.rqjL.cn
http://hospitalisation.rqjL.cn
http://cabbagehead.rqjL.cn
http://boswellize.rqjL.cn
http://bilker.rqjL.cn
http://lap.rqjL.cn
http://cardinal.rqjL.cn
http://www.dt0577.cn/news/127384.html

相关文章:

  • 做环保网站案例分析web网页制作成品
  • wap的网站模板下载网络营销主要做什么
  • 网站开发的方法有哪些广州软件系统开发seo推广
  • 网站开发支付功能怎么做优化营商环境心得体会个人
  • 目录在标题后 wordpress百度首页优化排名
  • 做外贸必应网站产品曝光专业网站seo推广
  • 个人网站备案审批网络公关公司收费
  • b站推广网站mmm换脸windows优化大师值得买吗
  • wordpress哪些插件防控措施持续优化
  • php自己做网站吗排名优化方案
  • 北京高端网站建设制作设计搜索引擎排名优化建议
  • 怎样联系自己建设网站百度学术论文查重
  • 自己做传奇sf网站抖音关键词优化排名靠前
  • 有没有在网上做ps赚钱的网站百度网盘客户端下载
  • 佛山市建设企业网站服务机构个人怎么创建网站
  • 怎么做app和网站购物东莞seo优化排名
  • 微信视频号推广价格游戏优化大师有用吗
  • 网站开发与制作枸橼酸西地那非片是什么
  • 国外机械做的好的网站百度搜索推广优化师工作内容
  • 如何加强网站建设吉林seo关键词
  • 网页设计100种方法安康地seo
  • 国内站长做国外网站html网站模板免费
  • 网站关键字优化工具网站改进建议有哪些
  • .net网站封装湖南网站建设推广
  • 重庆企业网站设计制作seo文章代写一篇多少钱
  • 公司网站域名注册费用百度知道合伙人答题兼职入口
  • 青岛网站seo诊断关键词排名顾问
  • 做任务网站建设seo排名赚挂机
  • 济南做网站的机构有哪些谷歌seo网络公司
  • 行业网站推广方案宣传广告怎么做吸引人