蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组

news2024/11/19 17:23:12

目录

一、最大子数组和

二、买卖股票最佳时机IV

三、第N个泰波那契数

四、环形数组


一、最大子数组和

1.状态表示

dp[i]:到第i数字,所有的最大和。

2.状态转移方程

dp[i]=max(dp[i-1]+p[i],p[i])(加入这个点是0)

我们来想一下,这个数组分为两种情况,要不他这个连续子数组长度只是一个,这样他就只是p[i],要不他这个数组长度不是一个,这样他就需要看他前面的i-1这个元素,当i-1位置的时候,dp[i-1]就是最大和(可能我们会陷入一个误区,认为这个数组,假如i-1位置是负数,那么肯定是不选i-1位置最好啊。那么假如我们不选这个i位置,他也就相当于连续数组断开了,他就是单个的数组。

3.初始化

最开始的必须要选择,所以说就是nums[0]

4.填表顺序

从左到右

5.返回值

return  返回dp表中最大值即可

class Solution {
    public int maxSubArray(int[] nums) {
        int m=nums.length;
    int []dp=new int[m];
    if(m==1){
        return nums[0];
    }
    dp[0]=nums[0];
    for(int i=1;i<m;i++){
        dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
    }
    int ret=-0x3f3f3f3f;
    for(int i=0;i<m;i++){
        ret=Math.max(ret,dp[i]);
    }
    return ret;
    }
}

二、买卖股票最佳时机IV

买卖股票最终弹

1.状态表示

f[i][k]:第m天处于已经买入但是没有卖出状态,第k笔交易所获的第最大利润

g[i][k]:第m天处于已经卖出但是没有买入的状态,第k笔交易所获的第最大利润

2.状态转移方程

f[i][j]=Math.max(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]Math.max(g[i-1][j],f[i-1][j-1]+prices[i]);

3.初始化

我们可以观察到g[][]=只有一个地方是等于j-1,那么也就是说,我们只需要初始化一个地方就可以,也就是只要初始化i就行,至于j我们将进行单独的操作

g[i][j]= g[i-1][j];

if(j-1>=0){

g[i][j]= Math.max(g[i-1][j],f[i-1][j-1]+prices[i]);

这个地方最有细节的地方要讲一下,怎么样,才算交易一次,我们这里面的交易一次,是需要卖出,而不是买入就算一次交易,因为如果这么算的话,初始化就和我们之前所进行的操作不同了,只有当卖出后,才算一次交易

f[0][0]=-prices[0];

g[0][0]=0;

假如你想的是买入就算一次,

下面这个式子才应该是正确的,因为第0次,其实并不算一次,所以我们也需要定到k+1,这样他的下标才是k

如果你想要定义只有k ,那么就要我们去思考怎么去更好的表达状态。f我认为它是属于交易之内的东西,所以,他也就不会出现直接交易一次,而是开始0下标的时候就出现,加入是交易一次,那么f在第0天的时候就应该是1了

4.填表顺序

从左到右,两个表一起填写

class Solution {
    public int maxProfit(int k, int[] prices) {
     int m=prices.length;
       k = Math.min(k, m / 2);
     int f[][]=new int[m][k+1];
     int g[][]=new int[m][k+1];

      for(int i=0;i<=k;i++){
        f[0][i]=g[0][i]=-0x3f3f3f3f;
      }
      
      f[0][0]=-prices[0];
      g[0][0]=0;
      
      for(int i=1;i<m;i++){
      for(int j=0;j<=k;j++){

      g[i][j]= g[i-1][j];
     
      f[i][j]=Math.max(f[i-1][j],g[i-1][j]-prices[i]);
      if(j-1>=0){
      g[i][j]= Math.max(g[i-1][j],f[i-1][j-1]+prices[i]);
        }
     }
  }
    int ret=0;
    for(int i=0;i<=k;i++){
        ret=Math.max(ret,g[m-1][i]);
    }  
    return ret;
    }
}

三、第N个泰波那契数

第N个泰勒那数

1.状态表示

dp[i]:以i位置结尾的,第i个泰波那契数。

2.状态转移方程

dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

3.初始化

dp[0]=0,dp[1]=1,dp[2]=1;

4.填表顺序

从左到右

5.返回值 返回dp[n]

class Solution {
    public int tribonacci(int n) {
//状态表示
int dp[]=new int[n+1];
if(n==0){
return 0;
}else if(n==1||n==2){
  return 1;
}
  dp[0]=0;
  dp[1]=1;
  dp[2]=1;

for(int i=3;i<=n;i++){
 dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
}

return dp[n];
    }
}

四、环形数组

1.状态表示

dp[i]:到第i位置,返回的非空数组最大和

2.状态转移方程

dp[i]=max(dp[i-1]+p[i],p[i])

这个题的难点就是在于他的数组一前一后那种值怎么处理,就是

既然它分为这两种情况,那么我们的状态表示也要重新制定一下

1.f[i]:表示到达i位置,最大的数组和。

2.g[i]:表示到达i位置,最小的数组和。

f[i]=Math.max(f[i-1]+p[i],p[i])

g[i]=Math.min(g[i-1]+p[i],p[i])

3.填表顺序

从左到右,两个表一起填写

4.初始化

开始的时候 f[0]=nums[0];
    g[0]=nums[0];简单粗暴即可

5.返回值,返回ret

class Solution {
    public int maxSubarraySumCircular(int[] nums) {
        int m=nums.length;
    int []dp=new int[m];
    int sum=0;
    for(int i=0;i<m;i++)
{
    sum=nums[i]+sum;
}    if(m==1){
        return nums[0];
    }
   int []f=new int[m];
   int []g=new int[m];
    f[0]=nums[0];
    g[0]=nums[0];
  
   for(int i=1;i<m;i++){
   f[i]=Math.max(f[i-1]+nums[i],nums[i]);
   g[i]=Math.min(g[i-1]+nums[i],nums[i]);
   }
   int ret=-0x3f3f3f3f;
    for(int i=0;i<m;i++){
//这个操作,是针对特殊情况,比如说,全是负的-3,-2,-3,这个情况的时候,sum==g[i]也就是说最小值等于总和,这样我会对这个进行处理,ret和f[i]做比较
          if(sum-g[i]==0){
                ret=Math.max(ret,f[i]);
                continue;
            }
   ret=Math.max(ret,Math.max(f[i],sum-g[i]));
    }
    return ret;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 面向对象 学习 优秀教程

油管看视频 沉浸式翻译插件&#xff0c;实现中文字幕&#xff01; 文章目录 Object Oriented Programming (OOP) in C Course Object Oriented Programming (OOP) in C Course https://www.youtube.com/watch?vwN0x9eZLix4 博主&#xff1a;https://www.youtube.com/CodeBeau…

手把手教你如何实现TNAS与云盘之间的无缝同步技巧

嘿&#xff0c;铁粉们&#xff01; 云盘的下载速度总是让我们抓耳挠腮 数据安全隐私问题让人担心不已 但在购入NAS之前 众多数据存放在云盘里 同时也想把NAS的数据备份在云盘里 实现备份321法则&#xff1f; 不用烦恼 铁威马来帮忙 无需其他多余操作 只要下载CloudSyn…

小米电视播放win10视频 win10共享问题

解决的方法就是安装SMB1.0协议 重启就OK了

redis的分布式锁

分布式锁是一种用在分布式系统中实现同步和互斥访问的机制。 1、分布式锁概念 满足分布式系统或者集群模式下&#xff0c;多进程可见并且互斥的锁。 分布式锁的核心思想就是让分布式集群中的节点都适用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;就能锁住线程…

小程序如何导入配送账号

为了提高配送效率和用户体验&#xff0c;可以导入配送账号&#xff08;包括电子面单快递物流账号、同城外卖配送账号&#xff09;到小程序中。导入后&#xff0c;可以实现一键发货&#xff0c;无需手动回填单号。而且在小程序中可以查看到物流状态&#xff0c;对于同城配送&…

CVE-2017-12149漏洞复现

目录 一、hunter上搜索web.title”锐捷网络”或者搜索web.icon”9c21df9129aeec032df8ac15c84e050d”&#xff0c;搜索相关资产。 二、一个一个点击查看&#xff0c;若出现以下界面就是锐捷的EW1200G路由器。 三、随便输入一个密码&#xff0c;发现是登不进去的。 四、此时…

操作系统:内存管理(二)虚拟内存管理

一战成硕 3.2 虚拟内存管理3.2.1 虚拟内存的基本概念3.2.2 请求分页管理方式3.2.3 页框分配3.2.4 页面置换算法3.2.5 抖动和工作集 3.2 虚拟内存管理 3.2.1 虚拟内存的基本概念 3.2.2 请求分页管理方式 页表机制 缺页中断机制 地址变换机构 3.2.3 页框分配 驻留集大小 内…

2023年软件测试工具总结 —— 单元测试工具

在应用程序中&#xff0c;单元是具有一个或多个输入和单个输出的软件中最小可测试部分。单元测试是一种测试软件代码单元的方法&#xff0c;通常包括一个或两个输入&#xff0c;产生一个输出。单元测试主要关注独立模块的功能正确性&#xff0c;目的是确保每个单元都按照预期的…

linux(二)

内部命令和外部命令 什么是命令&#xff1a;用来实现某一种功能的指令或程序 命令的执行依赖于解释器(如/bin/bash 用的最多) &#xff0c;解释器存放于/erc/shells, shells就是解释器统称 管理员的权限 普通用户的权限 命令提示符 查看ls的绝对路径 解释器&#xff0c;存在于…

单体架构 vs 微服务架构的全面比较

软件架构是指软件系统的高层设计和组织方式。它定义了系统的结构、组件、它们之间的交互以及它们如何满足系统的需求。有各种软件架构模式&#xff0c;每种都有其自身的优点和权衡。两种常见的架构模式是微服务架构和单体架构。 单体架构&#xff1a; 单体架构是一种传统的方法…

Pmdarima实现单变量时序预测与交叉验证

目录 1. pmdarima实现单变量时间序列预测 2. 时间序列交叉验证 2.1 滚动交叉验证(RollingForecastCV) 2.2 滑窗交叉验证(SildingWindowForecastCV) 1. pmdarima实现单变量时间序列预测 Pmdarima是以statsmodel和autoarima为基础、封装研发出的Python时序分析库、也是现在市…

【C++代码】分割等和子集,目标和,一和零,零钱兑换,动态规划--代码随想录

题目&#xff1a;分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 初步想法排序后双指针&#xff0c;发现不行 class Solution { public:bool canPartition(vector<int>&…

黑马 小兔鲜儿 uniapp 小程序开发- 商品详情模块- day05

黑马 小兔鲜儿 uniapp 小程序开发- 分类模块- day04-CSDN博客 小兔鲜儿 - 商品详情(登录前)-day05 商品详情页分为两部分讲解&#xff1a; 登录前&#xff1a;展示商品信息&#xff0c;轮播图交互&#xff08;当前模块&#xff09;登录后&#xff1a;加入购物车&#xff0c;立…

玩转硬件之Micro:bit的玩法(一)

写在前面 这么长时间以来一直在玩软件, 好像软件还没有研究明白&#xff0c;因为工作的转变&#xff0c;又开始接触到硬件&#xff0c;既然开始触碰到硬件了&#xff0c;也想记录一下。有的时候想想要不要写这段前言&#xff0c;但是不写又觉得比较突兀&#xff0c;好端端的怎…

python函数的定义与调用

python定义函数和函数的使用 函数 函数是对程序逻辑进行结构化或过程化的一种编程方法&#xff0c;将整块代码巧妙地隔离成易于管理的小块。把重复代码放到函数中而不是进行大量的拷贝&#xff0c;这样既能节省空间&#xff0c;也有助于保持一致性&#xff1b;通常函数都是用…

【数据结构】数组和字符串(十三):链式字符串的基本操作(串长统计、查找、复制、插入、删除、串拼接)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作&#xff08;链式存储&#xff09;1. 结构体2. 初始化3. 判空4. 串尾添加5. 打印6. 串长统计7. 查找8. 复制9. 插入10. 删除11. 串拼接12. 销毁13. 主函数14. 代码整合 4.3 字符串 字符串(String)是由零个或…

CodeGeeX:对标GitHub Copilot,国产免费可用的代码补全助手

大家好&#xff0c;我是豆小匠。 本期介绍的插件CodeGeeX&#xff0c;是一款免费的智能编程助手。 主要功能是代码生成和补全&#xff0c;但不止于此&#xff01; CodeGeeX介绍 CodeGeeX是清华大学和智谱AI联合打造的多语言代码生成模型。 第一代是完全在华为昇腾芯片平台训练…

华为OD机考算法题:生日礼物

题目部分 题目生日礼物难度易题目说明小牛的孩子生日快要到了&#xff0c;他打算给孩子买蛋糕和小礼物&#xff0c;蛋糕和小礼物各买一个&#xff0c;他的预算不超过x元。蛋糕 cake 和小礼物 gift 都有多种价位的可供选择。输入描述第一行表示cake的单价&#xff0c;以逗号分隔…

③ 软件工程CMM、CMMI模型【软考中级-软件设计师 考点】

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ③ 软件工程CMM、CMMI模型【软考中级-软件设计…

SpringCloud Alibaba Demo(Nacos,OpenFeign,Gatway,Sentinel)

开源地址&#xff1a; ma/springcloud-alibaba-demo 简介 参考&#xff1a;https://www.cnblogs.com/zys2019/p/12682628.html SpringBoot、SpringCloud 、SpringCloud Alibaba 以及各种组件存在版本对应关系。可参考下面 版本对应 项目前期准备 启动nacos. ./startup.c…