Acwing状态机DP
一.1057. 股票买卖 IV
二.题目分析
1.题目给我们两个条件。
2.有k笔交易。
3.每次只能连续买一次。
代码实现:
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int N = 1e5+10,INF=1e9+10; 4 int dp[N][110][2],a[N]; 5 int main() 6 { 7 int n,k; 8 cin >> n >> k; 9 for(int i = 1;i <= n;i++) cin >> a[i]; 10 memset(dp,-0x3f,sizeof(dp)); 11 for(int i = 0;i <= n;i++) dp[i][0][0] = 0; 12 //0表示第j次交易完成,1正在进行第j次交易 13 for(int i = 1;i <= n;i++) for(int j = 1;j <= k;j++) { 14 dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j][1]+a[i]); 15 dp[i][j][1] = max(dp[i-1][j][1],dp[i-1][j-1][0]-a[i]); 16 } 17 int res = 0; 18 for(int i = 0;i <= k;i++) res = max(res,dp[n][i][0]); 19 cout << res << endl; 20 return 0; 21 }
三.股票买卖Ⅴ
四.题目分析
1.题目要求我们可以无限天数买卖
2.题目要求我们不能连续买两天,必须要冷冻一天
3.不能连续买多个
状态机分析:
代码实现:
1 #include "bits/stdc++.h" 2 using namespace std; 3 int dp[100010][3]; 4 int main() 5 { 6 int n,x; 7 cin >> n; 8 dp[0][0] = dp[0][1] = -1e9; 9 for(int i = 1;i <= n;i++){ 10 cin >> x; 11 //可以买入的状态由上一次交易完或者上一次冷却后 12 dp[i][0] = max(dp[i - 1][2] - x,dp[i - 1][0]); 13 dp[i][1] = dp[i - 1][0] + x; 14 dp[i][2] = max(dp[i - 1][1],dp[i - 1][2]); 15 } 16 cout << max(dp[n][1],dp[n][2]); 17 return 0; 18 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}

浙公网安备 33010602011771号