首页 > 其他分享 >状态机DP,力扣188. 买卖股票的最佳时机 IV

状态机DP,力扣188. 买卖股票的最佳时机 IV

时间:2023-10-03 19:12:00浏览次数:39  
标签:力扣 状态 int IV 状态机 prices INF DP

状态机DP,力扣188. 买卖股票的最佳时机 IV

整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。一次只能参与一笔交易,最多可以进行 k 笔交易,求最大利润。

  • 确定状态f[n+1][k+2][2]f[i][j][0]、f[i][j][1]分别表示前i天最多进行j次交易,且在第i天时 未持有股票/持有股票 所能获得的最大利润

    • i位置的取值为0~n-1,在递推式中需要用到i-1的状态,所以插入一个起始状态-1,由于下标无法表示-1所以让所有状态后移一位,总状态个数为n+1
    • j位置的取值为0~kk+1个状态,在递推式中需要用到j-1的状态,所以插入一个起始状态-1,由于下标无法表示-1所以让所有状态后移一位,总状态个数为k+2
    • 结束状态:f[n][k + 1][0] = max(f[n][k + 1][0],f[n][k + 1][1])
  • 递推式:

    • f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j - 1][1] + prices[i - 1]);
    • f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j][0] - prices[i - 1]);
  • 初始化(边界条件),两种初始状态:1.合理初始状态=0 2.非法初始状态=-INF

    • f[·][0][·] = -INFf[·][0][·]表示原先的f[·][-1][·]j-1时此状态为非法状态设为-INF
    • f[0][j][0] = 0f[0][j][0]表示第0天未持有任何股票进行j次交易的利润为0
    • f[0][j][1] = -INFf[0][j][1]表示原先的f[-1][j][1]i-1表示为非法状态设为-INF
  • 状态机表示

Code

int maxProfit(int k, vector<int> &prices)
{
    int n = prices.size(), f[n + 1][k + 2][2];
    memset(f, -0x3f, sizeof(f));
    for (int i = 1; i <= k + 1; i++)
        f[0][i][0] = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= k + 1; j++)
        {
            f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j - 1][1] + prices[i - 1]);
            f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j][0] - prices[i - 1]);
        }
    return f[n][k + 1][0];
}

思路参考b站灵茶山艾府

标签:力扣,状态,int,IV,状态机,prices,INF,DP
From: https://www.cnblogs.com/odd-ryj/p/17741499.html

相关文章

  • 什么是 Angular 的 Active Support 版本和 Long Term Support 版本
    AngularActiveSupport版本和LongTermSupport版本是Angular框架的两个关键概念,它们在Angular的版本管理和维护策略中起着重要的作用。本文将详细介绍这两种版本,并提供示例以更好地理解它们。1.Angular版本概览在深入讨论ActiveSupport版本和LongTermSupport版本之前,让......
  • naive set theory 笔记
    19:302023/9/28今天粗略看了第九到十二章的内容,没有完全看懂,只是粗略看了一遍。16:212023/9/29第十三到第十七章,同上。17:022023/9/30第十八到第二十二章,同上。16:362023/10/1第二十三到第二十五章,同上。第一章,终于知道axiomofextension是什么了,就是简单的元素相......
  • Codeforces Round 901 (Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1875。爱丽数码我真的好喜欢你啊为了你我要定制你的帆布包口牙!!!!A显然只会在剩余时间为1时使用工具,模拟即可。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglong//========......
  • 论文解读:HybridCR: weakly-supervised 3D point cloud semantic segmentation via hybr
    HybridCR:weakly-supervised3Dpointcloudsemanticsegmentationviahybridcontrastiveregularization基于混合对比学习正则化约束的增强方法,Li等人(2022a)使用极少标注(0.03%)在室内点云数据集上获得的分割精度为全监督方法的78.3%。是第一个利用点一致性并以端到端方式采用......
  • 什么是 Angular 14 的 strict typing of Angular Reactive Forms
    Angular14引入的"stricttypingofAngularReactiveForms"是一项强大的功能,它进一步提高了Angular应用程序的类型安全性和可维护性,特别是在处理表单时。这个功能使开发人员能够更精确地定义表单控件和表单模型的类型,从而减少了潜在的运行时错误,并提供了更好的代码提示和文......
  • hive知识点散记
    在不切换数据库的前提下查询某一数据库下的所有表showtablesin数据库名;查询显示某一张表的元数据信息descformatted表名;查询当前数据库名称selectcurrent_databases();对查询结果进行去重selectdistinctcnamefromstu;【不写dist......
  • 「题解」Codeforces Round 894 (Div. 3)
    A.GiftCarpetProblem题目Sol&Code签到题#include<bits/stdc++.h>#defineN21typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,n,m,a[4];std::strings[N];i......
  • Codeforces Round 730 (Div. 2) B. Customising the Track
    有\(n\)条高速公路,第\(i\)条告诉公路上的车流为\(a_i\)。现在可以执行以下操作任意次:将第\(i\)条高速公路上的一辆车移到第\(j\)条高速公路。需要求最小的\(\sum_{i=1}^{n}\sum_{j=i+1}^{n}|a_i-a_j|\)。不难发现可以构造\(\foralli,j,a_i=a_j\)使任......
  • Educational Codeforces Round 112 (Rated for Div. 2) A. PizzaForces
    有三种披萨:\(6\)、\(8\)、\(10\)块披萨。制作时间分别需要:\(15\)、\(20\)、\(25\)分钟。现在有\(n\)个人,每人需要一块披萨。询问使所有人能获得披萨的最快时间。观察:发现三种披萨的性价比都一样。(否则按最优性价比贪心)需要让得到的披萨数量\(m\geqn\)。不妨让\(n\)对......
  • 题解 Codeforces Round 901 (Div. 1) / CF1874A~E
    题解CodeforcesRound901(Div.1)/CF1874A~E比赛情况:过了AB。赛后发现B是假复杂度。https://codeforc.es/contest/1874A.JellyfishandGameProblemAlice&Bob又在博弈,Alice手上有\(n\)个苹果,第\(i\)个苹果的价值是\(a_i\);Bob手上有\(m\)个苹果,第\(i\)......