1058. 股票买卖 V
题意:
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
题解:
如果不考虑冷冻期,我们
设dp[i][0]表示只考虑前i支股票,当前没有股票的最大收益
dp[i][1]表示只考虑前i支股票,当前有股票的最大收益
现在考虑冷冻期,我们可以设dp[i][2]表示只考虑前i支股票,目前处于冷冻期的最大收益
将所有情况(状态)都设出来之后,我们开始列状态转移方程
当前没有股票可以是前一天没股票转移过来,也可能是前一天冷冻期转移过来
当前有股票可以是前一天没股票买当天转移过来,也可以是前一天有股票转移过来
冷冻期是前一天有股票卖掉转移而来
最后三种状态取最大值
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e5+9;
int a[maxn],dp[maxn][3];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];memset(dp,-0x3f,sizeof dp);dp[0][0]=0;for(int i=1;i<=n;i++){dp[i][0]=max(dp[i-1][0],dp[i-1][2]);dp[i][1]=max(dp[i-1][0]-a[i],dp[i-1][1]) ;dp[i][2]=max(dp[i-1][2],dp[i-1][1]+a[i]) ;}cout<<max(dp[n][0],max(dp[n][1],dp[n][2]))<<endl;return 0;
}
/*
dp[i][0]没有股票
dp[i][1]有股票
dp[i][2]处于冷冻期
dp[i][0]=max(dp[i-1][0],dp[i-1][2])
dp[i][1]=max(dp[i-1][0]-a[i],dp[i-1][1])
dp[i][2]=max(dp[i-1][2],dp[i-1][1]+a[i])
*/