光看题目,无形之中就为这道题增加了难度,这里边需要考虑的问题更多,需要详细了解其内容,可以搜索代码随想录,我也是看了他的文章后才会大有启发,制作了简易的思维导图,声明一下,我不是创作者,我只是创作者的搬运工,还有可能搬的有些遗漏,主要是对自己的学习的一个总结,方便自己抽时间去复习主要内容和思想。
接下来请看例题:
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例: 输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
解释:因为中间有冷冻期,所以我们就得考虑冷冻期这一天是没有办法进行操作的,那么主要有一下几个状态需要去考虑:
0代表买入股票状态的最大价值:
dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));
1代表保持卖出股票:
dp[i][1]=max(dp[i-1][1],dp[i-1][3]);
2代表今天卖出股票:
dp[i][2]=dp[i-1][0]+prices[i];
3代表今天是冷冻期:
dp[i][3]=dp[i-1][2];
接下来需要考虑初始化:
dp[0][0]表示在第0天进行买入,所以手里的价值为dp[0][0]=-prices[0];
dp[0][1]:在第0天之前根本就不存在买入和冰冻期,所以现在处于卖出状态的价值初始化为0;
dp[0][2]:在第0天之前也根本不存在买入和冰冻期,所以这一天卖出的价值也初始化为0;
dp[0][3]:在第0天之前也根本不存在买入,所以现在也不存在冰冻期,那么初始化也为0.
接下来coding:
#include <iostream>
#include <vector>
using namespace std;
int maxPrices(vector<int> &prices)
{
int len=prices.size();
vector<vector<int>>dp(prices.size(),vector<int>(4,0));
dp[0][0]=-prices[0];
for(int i=1;i<prices.size();++i)
{
dp[i][0]=max(dp[i-1][0],max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));
dp[i][1]=max(dp[i-1][1],dp[i-1][3]);
dp[i][2]=dp[i-1][0]+prices[i];
dp[i][3]=dp[i-1][2];
}
return max(dp[len-1][3],max(dp[len-1][1],dp[len-1][2]));
}
int main()
{
vector<int> price={1,2,3,0,2};
int val=maxPrices(price);
cout<<"最大价值为:"<<val<<endl;
return 0;
}
以上代码亲测有效!