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 }

题目链接:1057. 股票买卖 IV - AcWing题库

 

三.股票买卖Ⅴ

  

 

 

四.题目分析

  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 }

题目链接:1058. 股票买卖 V - AcWing题库

posted @ 2022-07-11 16:21  scannerkk  阅读(40)  评论(0)    收藏  举报