(状态机dp)股票买卖 IV

1|0题目:

给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一次买入卖出合为一笔交易。
输入格式
第一行包含整数 N 和 k,表示数组的长度以及你可以完成的最大交易数量。
第二行包含 N 个不超过 10000 的正整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
1≤N≤1e5,
1≤k≤100
输入样例1:

3 2 2 4 1

输出样例1:

2

输入样例2:

6 2 3 2 6 5 0 3

输出样例2:

7

2|0思路:

最开始没有考虑全初始化的问题,很难受。

3|0AcCode:

#include<bits/stdc++.h> using namespace std; #define endl '\n' typedef long long ll; typedef pair<int, int> PII; const int mod = 1e9 + 7; const int inf = 0x3f3f3f3f; const int N = 1e5 + 10; int n, k, m, w[N]; int dp[N][110][2]; int main(void){ ios::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for(int i = 1; i <= n; i++) cin >> w[i]; memset(dp, -0x3f, sizeof dp); //就这个 for(int i = 1; i <= n; i++) //还有这个初始化,下次一定想仔细一点 dp[i][0][0] = 0, dp[i][0][1] = -w[i]; for(int i = 2; i <= n; i++){ for(int j = 0; j <= k; j++){ if(j >= 1) dp[i][j][0] = max(dp[i - 1][j - 1][1] + w[i], dp[i - 1][j][0]); else dp[i][j][0] = dp[i - 1][j][0]; dp[i][j][1] = max(dp[i - 1][j][0] - w[i], dp[i - 1][j][1]); } } int res = 0; for(int i = 0; i <= k; i++) res = max(res, dp[n][i][0]); cout << res << endl; return 0; }

__EOF__

本文作者ReSakura
本文链接https://www.cnblogs.com/ReSakura/p/16218227.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ReSakura  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示