当前位置: 首页 > 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/417573.html

相关文章:

  • 怎么制作网站软件做游戏需要学什么
  • 上海滕州建设集团网站网页设计心得体会100
  • 成都网站建设推广在线咨询云南云南省城乡建设厅网站
  • 聊天网站备案建设服装网站的论文
  • 网站开发发现趋势南昌网站排名优化软件
  • 品牌网站建设浩森宇特旅游景区网络推广方案
  • 网站无搜索结果页面怎么做沈阳网站怎么推广
  • 萧山区建设局网站php黄页系统
  • 百度站长工具是什么意思基于PHP网站开发的管理系统设计与开发
  • 涿州做软件和网站的深圳seo网络公司
  • 滴答手表网站网站建设和架构
  • 德宏州乡城建设局网站pc网站自动转换wap网站
  • 快站建站怎么收费的建设网银怎么提高转账限额
  • com域名注册1元铁岭网站seo
  • 网站制作 温州建设银行佛山分行网站
  • 青岛网站定制开发烟台网站建设哪家专业
  • 江门网站建设方案优化wordpress全局歌曲
  • 上海设计师网站有哪些秦皇岛房产局网签查询
  • 深圳最新消息今天新增病例怎么做网站的优化
  • 营销网站制作设计网站海外推广技巧
  • 门户网站建设和运行招标文件莱芜新闻头条
  • 国外网站翻墙怎么做文学网站开发
  • 互联网中厂有哪些公司东莞网站优化方法有哪些
  • 常用网站代码广州洲聚网站开发
  • 永久免费网站建设百度指数的使用方法
  • 茂名网站建设服务扬州新闻头条最新消息
  • 用ps怎么做网站步骤做网站的怎么获取客户信息
  • 网站建设 江苏做外汇应该看哪一家网站
  • 网站建设项目数智慧团建入口登录网站
  • 如何加强旅游电子商务网站的建设计算机网站建设与管理是什么