买卖股票 状态机模型的理解
经典讲解https://www.cnblogs.com/Bella2017/p/11277064.html
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
输入: [7,1,5,3,6,4]
输出:5
状态机模型如下:
class Solution {
public:int maxProfit(vector<int>& prices) {int dp_i_0 = 0, dp_i_1 = INT_MIN; //base casefor(int i=0; i<prices.size(); ++i){dp_i_1 = max(dp_i_1, -prices[i]); dp_i_0 = max(dp_i_0, dp_i_1+prices[i]);}return dp_i_0;}
};
个人的理解:
dp[n][k][0]表示第n天,如果最多允许k次交易且手上这天没股票的情况下的最大利润
dp[n][k][1]表示第n天,如果最多允许k次交易且手上这天有股票的情况下的最大利润
那么,
dp[n][k][0] = max(dp[n-1][k][0], dp[n-1][k][1] + prices[i])
// 卖股票
dp[n][k][1] = max(dp[n-1][k][1], dp[n-1][k-1][0] - prices[i])
// 买股票,这相当于一次新交易
当k = 1的时候
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], -prices[i])
有个问题啊,为啥我之前把计算dp_i_0和dp_i_1的公式写反了还是对的呢?
这个和公式的特性有关,下面是先算dp_i_1的结果
代码1
class Solution {
public:int maxProfit(vector<int>& prices) {int dp_i_0 = 0, dp_i_1 = INT_MIN; //base casefor(int i=0; i<prices.size(); ++i){dp_i_1 = max(dp_i_1, -prices[i]); dp_i_0 = max(dp_i_0, dp_i_1+prices[i]);}return dp_i_0;}
};
和代码2
class Solution {
public:int maxProfit(vector<int>& prices) {int dp_i_0 = 0, dp_i_1 = INT_MIN; //base casefor(int i=0; i<prices.size(); ++i){dp_i_0 = max(dp_i_0, dp_i_1+prices[i]);dp_i_1 = max(dp_i_1, -prices[i]); }return dp_i_0;}
};
我们觉得可能出问题的点在于先算dp_i_1,可能dp_i_0的值会受到影响
那我们看看实际情况下真的会受影响吗
假设dp_i_1变大,
对于代码1, dp_i_0是不变的
对于代码2 dp_i_0也是不变的
所以没有影响
引申:
309. Best Time to Buy and Sell Stock with Cooldown
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-2][0] - prices[i]); // 注意,由于cooldown机制的存在,不能是i-1
714. Best Time to Buy and Sell Stock with Transaction Fee
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i] + fee);
dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);
123. Best Time to Buy and Sell Stock III
int maxProfit(vector<int>& prices) {int dp10 = 0;int dp11 = INT_MIN;int dp20 = 0;int dp21 = INT_MIN;for (int price: prices){dp20 = max(dp20, dp21 + price);dp21 = max(dp21, dp10 - price);dp10 = max(dp10, dp11 + price);dp11 = max(dp11, -price );}return dp20;}
188. Best Time to Buy and Sell Stock IV
vector<int> dp0(k+1, 0);
vector<int> dp1(k+1, INT_MIN);
for (int num: nums)
{for (int i = 1; i <= k; i++){dp0[i] = max(dp0[i], dp1[i] + num);dp1[i] = max(dp1[i], dp0[i-1] - num);}
}
买卖股票 状态机模型的理解相关推荐
- 【动态规划】状态机模型:买卖股票的最佳时机 IV
买卖股票的最佳时机 IV 如果有n天,那么 一共要走n条线段.w[i] 表示 第i天 收益为 w[i]. 交易一次,相当于从0->1->0走一圈,交易k次,一共要走k圈. f[i][j]: ...
- 算法套路十七——买卖股票问题:状态机 DP
算法套路十七--买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法. 状态机DP(State Machine DP)是 ...
- 【动态规划】状态机模型
整理的算法模板合集: ACM模板 文章目录 A.抛砖引玉 - AcWing 1049. 大盗阿福 B.AcWing 1057. 股票买卖 IV C.AcWing 1058. 股票买卖 V D.AcWi ...
- 状态模式的介绍及状态机模型的函数库javascript-state-machine的用法和源码解析
文章大体就两部分: 状态模式 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理. ...
- 聊聊买卖股票的最佳时机
前言 大家好,我是大赛哥,好久不见,天天想念! 最近梳理高频动态规划问题,股票问题当然是非常经典的动态规划问题,并且整个系列有好几道题,这里我整理了6道股票系列的经典问题分享给大家,咱们今天聊聊买卖股 ...
- Leetcode 188.买卖股票的最佳时机IV
买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...
- DP 状态机模型 AcWing算法提高课 详解
状态机模型 AcWing 1049. 大盗阿福 #include <iostream> #include <algorithm> #include <cmath> ...
- 动态规划之状态机模型
状态机模型 状态机 状态机与动态规划之间的联系 状态机的本质之动态规划描述 股票买卖系列 股票买卖 股票买卖Ⅱ 一.动态规划解法 二.贪心解法 股票买卖Ⅲ 前后缀分解 股票买卖Ⅳ 股票买卖Ⅴ KMP ...
- 如何买卖股票?不要慌,我有妙招!
预计阅读时间15分钟. Leetcode第121题到123题连续出现了三道买卖股票相关的题目,一年前的网易笔试和半年前的百度面试都遇到过121题,不过不用慌,看完本文,你一定能够完美解决买卖股票的问题 ...
最新文章
- vue入门实践,style和数据绑定
- 美国微生物科学院22年院士公布!舒跃龙、黄力、卢洪洲、赵国屏!
- python json数据的文件读写操作
- 计算机 双 ip地址,win7双ip怎么设置_Win7电脑如何设置双IP地址
- java恶意小程序_小程序java实现校验一张图片是否含有违法违规内容security.imgSecCheck...
- Scala控制抽象:将一段代码作为参数传递给高阶函数去执行
- 20172304 《程序设计与数据结构》第四周学习总结
- SpringBoot中处理的转发与重定向
- NIO客户端主要创建过程
- 在awk中执行外部命令
- 这个乐趣,使用芯片操作集成电路
- Excel_使用条件格式制作甘特图
- 微信小程序生成二维码方法接口集合
- ​关于技术变现的几点思考
- 入侵检测——WebCrack
- c语言scanf不用取地址符,关于c中printf和scanf函数是否使用取地址符的疑问
- 安装GNOME3桌面并设置开机启动图形界面
- kingbase之ksql命令工具
- flashback使用
- JSP九大内置对象是什么?