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

苏州吴中区建设局网站怎样登录韵网网站

苏州吴中区建设局网站,怎样登录韵网网站,高端网站优化,营销机构代码怎么填目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 1.求dp[i][j].holding 2.求dp[i][j].sold 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这道题把第123题推广为一…

目录

题目描述

第一步,明确并理解dp数组及下标的含义

第二步,分析明确并理解递推公式

1.求dp[i][j].holding

2.求dp[i][j].sold

第三步,理解dp数组如何初始化

第四步,理解遍历顺序

代码


题目描述

这道题把第123题推广为一般情形。第123题限制最多可以完成两笔交易,这道题改为最多可以完成k笔交易。因此,两道题没有本质区别。仍然用第123题的思路来分析。

第一步,明确并理解dp数组及下标的含义

//最多可以完成k笔交易,用j表示交易的序号,j从0开始起算表示第一次交易,j取值范围是[0,k-1]

//约定好,下文提到的【第j只股票】指的是第j次买入的股票

//dp[i][j].holding表示到第i天结束时,处于持有第j只股票的状态的最大利润

//dp[i][j].sold表示到第i天结束时,处于已经卖出第j只股票但是还没有买入第j+1只股票的状态下的最大利润

    struct State{int holding = 0;int sold = 0;};int n = prices.size();//最多可以完成k笔交易,用j表示交易的序号,j从0开始起算表示第一次交易,j取值范围是[0,k-1]//约定好,下文提到的【第j只股票】指的是第j次买入的股票//dp[i][j].holding表示到第i天结束时,处于持有第j只股票的状态的最大利润//dp[i][j].sold表示到第i天结束时,处于已经卖出第j只股票但是还没有买入第j+1只股票的状态下的最大利润vector<vector<State>> dp(n);for(int i =0;i <n;i++)dp[i].resize(k);

第二步,分析明确并理解递推公式

1.求dp[i][j].holding

//到第i天结束时处于持有第j只股票的状态,有两种可能的原因:

//一是前一天(第i-1天)结束时就已经处于持有第j只股票的状态(对应dp[i-1][j].holding),第i天什么也不做。

//二是第i天买入了第j只股票(需支付prices[i]),第i天能买入第j只股票的前提是前一天(第i-1天)结束时处于已经卖出第j-1只股票但是还没有买入第j只股票的状态(对应dp[i-1][j-1].sold)。j如果是0就没有第j-1只股票,需要特别处理。

int temp = (j > 0) ? (dp[i-1][j-1].sold) : (0);

dp[i][j].holding = max(dp[i-1][j].holding,temp - prices[i]);

2.求dp[i][j].sold

//到第i天结束时处于已经卖出第j只股票但是还没有买入第j+1只股票的状态,有两种可能的原因:

//一是前一天(第i-1天)结束时就已经处于已经卖出第j只股票但是还没有买入第j+1只股票的状态(对应dp[i-1][j].sold),第i天什么也不做

//二是第i天卖出了第j只股票(收入prices[i]),第i天能卖出第j只股票的前提是前一天(第i-1天)结束时处于持有第j只股票的状态(对应状态dp[i-1][j].holding)

dp[i][j].sold = max(dp[i-1][j].sold,dp[i-1][j].holding + prices[i]);

        for(int i = 1;i < n;i++){for(int j = 0;j < k;j++){//到第i天结束时处于持有第j只股票的状态,有两种可能的原因://一是前一天(第i-1天)结束时就已经处于持有第j只股票的状态(对应dp[i-1][j].holding),第i天什么也不做。//二是第i天买入了第j只股票(需支付prices[i]),第i天能买入第j只股票的前提是前一天(第i-1天)结束时处于已经卖出第j-1只股票但是还没有买入第j只股票的状态(对应dp[i-1][j-1].sold)。j如果是0就没有第j-1只股票,需要特别处理。int temp = (j > 0) ? (dp[i-1][j-1].sold) : (0);dp[i][j].holding = max(dp[i-1][j].holding,temp - prices[i]);//到第i天结束时处于已经卖出第j只股票但是还没有买入第j+1只股票的状态,有两种可能的原因://一是前一天(第i-1天)结束时就已经处于已经卖出第j只股票但是还没有买入第j+1只股票的状态(对应dp[i-1][j].sold),第i天什么也不做//二是第i天卖出了第j只股票(收入prices[i]),第i天能卖出第j只股票的前提是前一天(第i-1天)结束时处于持有第j只股票的状态(对应状态dp[i-1][j].holding)dp[i][j].sold = max(dp[i-1][j].sold,dp[i-1][j].holding + prices[i]);}}

第三步,理解dp数组如何初始化

for(int j = 0;j <k;j++){

dp[0][j].holding = -prices[0];//到第0天结束时处于持有第j只股票的状态,可以理解为对第0天的股票买了又卖重复j-1次之后再买入

dp[0][j].sold = 0;//到第0天结束时处于已经卖出第j只股票但是还没有买入第j+1只股票的状态,可以理解为对第0天的股票买了又卖重复j次

}

        for(int j = 0;j <k;j++){dp[0][j].holding = -prices[0];//到第0天结束时处于持有第j只股票的状态,可以理解为对第0天的股票买了又卖重复j-1次之后再买入dp[0][j].sold = 0;//到第0天结束时处于已经卖出第j只股票但是还没有买入第j+1只股票的状态,可以理解为对第0天的股票买了又卖重复j次}

第四步,理解遍历顺序

由递推公式

int temp = (j > 0) ? (dp[i-1][j-1].sold) : (0);

dp[i][j].holding = max(dp[i-1][j].holding,temp - prices[i]);

dp[i][j].sold = max(dp[i-1][j].sold,dp[i-1][j].holding + prices[i]);

可知日期的序号i(或者说股价的序号)应该从小到大遍历。

可知买入的股票的序号j,也应该从小到大遍历。

代码

class Solution {struct State{int holding = 0;int sold = 0;};
public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();//最多可以完成k笔交易,用j表示交易的序号,j从0开始起算表示第一次交易,j取值范围是[0,k-1]//约定好,下文提到的【第j只股票】指的是第j次买入的股票//dp[i][j].holding表示到第i天结束时,处于持有第j只股票的状态的最大利润//dp[i][j].sold表示到第i天结束时,处于已经卖出第j只股票但是还没有买入第j+1只股票的状态下的最大利润vector<vector<State>> dp(n);for(int i =0;i <n;i++)dp[i].resize(k);for(int j = 0;j <k;j++){dp[0][j].holding = -prices[0];//到第0天结束时处于持有第j只股票的状态,可以理解为对第0天的股票买了又卖重复j-1次之后再买入dp[0][j].sold = 0;//到第0天结束时处于已经卖出第j只股票但是还没有买入第j+1只股票的状态,可以理解为对第0天的股票买了又卖重复j次}for(int i = 1;i < n;i++){for(int j = 0;j < k;j++){//到第i天结束时处于持有第j只股票的状态,有两种可能的原因://一是前一天(第i-1天)结束时就已经处于持有第j只股票的状态(对应dp[i-1][j].holding),第i天什么也不做。//二是第i天买入了第j只股票(需支付prices[i]),第i天能买入第j只股票的前提是前一天(第i-1天)结束时处于已经卖出第j-1只股票但是还没有买入第j只股票的状态(对应dp[i-1][j-1].sold)。j如果是0就没有第j-1只股票,需要特别处理。int temp = (j > 0) ? (dp[i-1][j-1].sold) : (0);dp[i][j].holding = max(dp[i-1][j].holding,temp - prices[i]);//到第i天结束时处于已经卖出第j只股票但是还没有买入第j+1只股票的状态,有两种可能的原因://一是前一天(第i-1天)结束时就已经处于已经卖出第j只股票但是还没有买入第j+1只股票的状态(对应dp[i-1][j].sold),第i天什么也不做//二是第i天卖出了第j只股票(收入prices[i]),第i天能卖出第j只股票的前提是前一天(第i-1天)结束时处于持有第j只股票的状态(对应状态dp[i-1][j].holding)dp[i][j].sold = max(dp[i-1][j].sold,dp[i-1][j].holding + prices[i]);}}int max_profit = 0;for(int j = 0;j < k;j++){if(dp[n-1][j].sold > max_profit)max_profit = dp[n-1][j].sold;}return max_profit;}
};

把本题的代码中的k改成2,直接可以用作123. Best Time to Buy and Sell Stock III的答案。

http://www.dtcms.com/a/497467.html

相关文章:

  • 电子商务网站的建设和维护论文活动策划ppt
  • wordpress网站被黑了广州学网站开发
  • 凡科建站官网网站模板手机网页制作app
  • 专门做布料的网站深圳龙华 网站建设
  • 天津建设工程合同备案网站最简单的网站建设
  • 企业网站的基本形式不包括网页设计作业怎么打包
  • 桐城建设规划局网站硬件开发和软件开发
  • 主流门户网站有哪些设计君
  • 自己怎样优化网站外贸展示网站多少钱
  • 番禺网站建设公司有哪些制作网站网页域名的公司
  • 萍乡做网站芜湖建设网站
  • 网站框架设计好后怎么做查询工程建设项目的网站
  • 长春商城网站制作网站怎么找
  • 做弹幕视频效果的网站wordpress 搜索排名
  • 北斗B3四阵元抗干扰天线的实现
  • 网站设计美工排版编辑做计算机模拟ie题模拟网站打不开
  • 九江建网站wordpress管理密码忘记
  • 湖南建设职称报考在哪个网站网站建设介绍推广用语
  • 了解网站建设的流程wordpress可视化幻灯片插件
  • 那些彩票广告网站怎么做的用自己头像做的圣诞视频网站
  • 已有网站怎么做后台网站试运营
  • 用dw做的企业网站rsd wordpress
  • 常州建站费用济南槐荫区做网站的
  • 南坪做网站黔西县城市建设局网站
  • 港海(天津)建设股份有限公司网站郑州app
  • 中国建设银行蚌埠官方网站沈阳建网站
  • 松江网站建设哪家好asp+php+jsp网站开发
  • 西安驾校网站建设公司网站开发费用记入什么科止
  • 公司网站用什么语言开发公司免费邮箱如何注册
  • 前端是做网站的吗年轻人喜欢的短视频app推荐