动态规划|特殊的多行规划|dp[2][] 用两行元素分别记录状态变化

news2024/11/15 11:19:46

多行规划是我自己整理此类问题时起的名字,如有专属名词,麻烦评论告知

用于处理当动态规划中,需要记录多个值的状态变化时。

376. 摆动序列(特殊的自定义二维dp)

在这里插入图片描述
做惯了一般的动态规划,突然看到这种题目,容易发懵。
明明感觉是动态规划,但是你就是很难套进去,一维的做不出,二维的太复杂。
其实可以换一个思路,我们可以用两行dp分别记录状态的变化

dp[0][i] 到达i元素,以降序为结尾的 摆动序列 的最大长度
dp[1][i] 到达i元素,以升序为结尾的 摆动序列 的最大长度

然后每次遍历到i元素的时候,进行判断

若是升序,可拼凑到降序结尾的摆动序列,即之前降序为结尾的摆动序列最大长度+1,
dp[1][i] = dp[0][i-1] + 1; dp[0][i]则不变
同理 若是降序 dp[0][i] = dp[1][i-1]+1;dp[1][i]不变
若是相等,全不变

那么就很容易写出来了

class Solution {
    public int wiggleMaxLength(int[] nums) {
        // dp[0][i] 到达i元素,以降序为结尾的 摆动序列 的最大长度
        // dp[1][i] 到达i元素,以升序为结尾的 摆动序列 的最大长度

        // 到达i元素后,若是升序,可拼凑到降序结尾的摆动序列,即之前降序为结尾的摆动序列最大长度+1,则 dp[1][i] = dp[0][i-1] + 1; dp[0][i]则不变
        // 同理 若是降序 dp[0][i] = dp[1][i-1]+1;dp[1][i]不变
        // 若是相等,全不变

        // 初始化,dp[0][0]=1, dp[0][1]=1;

        int[][] dp = new int[2][nums.length];
        dp[0][0]=1;
        dp[1][0]=1;

        for(int i=1;i<nums.length;i++){

            // 若是升序
            if(nums[i]>nums[i-1]){
                dp[1][i] = dp[0][i-1] + 1;
                dp[0][i] = dp[0][i-1];
            }else if(nums[i]<nums[i-1]){
                dp[0][i] = dp[1][i-1]+1;
                dp[1][i] = dp[1][i-1];
            }else{
                dp[0][i] = dp[0][i-1];
                dp[1][i] = dp[1][i-1];
            }
        }

        return Math.max(dp[0][nums.length-1],dp[1][nums.length-1]);

    }
}

当然,你会发现并不需要用数组存储,直接用两个变量存储即可。

class Solution {
    public int wiggleMaxLength(int[] nums) {
        int up=1;
        int down=1;
        for(int i=1;i<nums.length;i++){
            // 若是升序
            if(nums[i]>nums[i-1]){
                up = down + 1;
            }else if(nums[i]<nums[i-1]){
                down=up+1;
            }
        }
        return Math.max(down,up);
    }
}

但是你只有理解了上面的数组存储,后面的两个变量直接存储才会清楚如何实现的。

152. 乘积最大子数组

在这里插入图片描述
这道题其实思考一下,它也是有两份状态变化的,你需要存储一个最大值最小值,因为后面是负数,最大值会成最小值,最小值有可能就成为了最大值。
那么就想到了多行规划。

dp[][i] 表示到达第i个元素时,数组的最连续最大乘积
dp[2][i] 第一行最大值,第二行最小值

那么当遍历到i元素时,最大值只可能有三种情况:
最大值乘以nums[i],最小值乘以nums[i],nums[i]比较一下即可。

dp[0][i] = max{dp[0][i-1]*nums[i],dp[1][i-1]*nums[i],nums[i]}
同理
dp[1][i] = min{p[0][i-1]*nums[i],dp[1][i-1]*nums[i],nums[i]}

那么代码也就迎刃而解了

class Solution {
    public int maxProduct(int[] nums) {

         int[][] dp = new int[2][nums.length];
         int max=nums[0];

         // 初始化
         dp[0][0]=nums[0];
         dp[1][0]=nums[0];
         // i从1开始遍历
         for(int i=1;i<nums.length;i++){
             dp[0][i] = Math.max(dp[0][i-1]*nums[i], 
                Math.max(dp[1][i-1]*nums[i],nums[i]));
             dp[1][i] = Math.min(dp[0][i-1]*nums[i], 
                Math.min(dp[1][i-1]*nums[i],nums[i]));
             max = Math.max(dp[0][i],max);
         }
         return max;
    }
}

再按照老套路,优化一下dp

class Solution {
    public int maxProduct(int[] nums) {

         int max=nums[0];
         int min=nums[0];
         int plus=nums[0];

         // i从1开始遍历
         for(int i=1;i<nums.length;i++){
             // 记录个max,避免后续计算min时,max已被改变
             int temp = max;
             max = Math.max(max*nums[i],Math.max(min*nums[i],nums[i]));
             min = Math.min(temp*nums[i],Math.min(min*nums[i],nums[i]));
             plus = Math.max(max,plus);
         }
         return plus;

    }
}

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

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

相关文章

UDPTCP网络编程

udp编程接口 一个UDP程序的编写可以分为3步&#xff1a; 创建一个网络套接字&#xff1a; 它相当于文件操作时的文件描述符&#xff0c;是一个程序进行网络通讯的门户&#xff0c; 所有的网络操作都要基于它 绑定IP和端口&#xff1a; 需要为网络套接字填充IP和端口信息 但是…

Python - 操作txt文件

文章目录打开txt文件读取txt文件写入txt文件删除txt文件打开txt文件 open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue)函数用来打开txt文件。 #方法1&#xff0c;这种方式使用后需要关闭文件 f open("data.txt","r&qu…

【Visual Studio】git提交代码时使用GPG

前言 下载安装GPG的过程省略,直接开始进行配置 0.visual studio 版本说明 其余版本未测试,但是应该也是可以的 1 获取GPG的密钥ID 1.1 window下可以打开Kleopatra查看生成好的密钥的密钥ID 1.2 也可以从命令行中获取 gpg --list-keys 红框位置,后16位就是密钥ID 2 配置.git…

QML MouseArea详解

1.MouseArea简介 MouseArea是一个不可见的项目&#xff0c;通常与一个可见的项目一起使用&#xff0c;以便为该项目提供鼠标处理。通过有效地充当代理&#xff0c;鼠标处理的逻辑可以包含在MouseArea项中。 常用属性&#xff1a; 属性 类型描述 containsMouse bool 光标当前…

刷题笔记2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 […

二、Spring概述

1.Spring简介 Spring是一个开源框架&#xff0c;它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 从简单性、可测试性和松耦合的角度而言&#xff0c;任何Java应用都可以从Spring中受益。 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 Sp…

关于如何合理设置线程池参数解决方案

关于如何合理设置线程池参数解决方案&#xff08;ThreadPoolExecutor&#xff09; 线程池参数有哪些 我们直接来看构造方法 ... public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6,ThreadFactory var7, Rejecte…

W25Q256被写保护如何修改

W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到 能够正确的读到ID&#xff0c;但是读到的数据不正确 1.1 打印的寄存器的值 0x2 BUSY &#xff1a;只读&#xff0c; 指令正在执行 WEL (1) &…

物盾安全汤晓冬:工业互联网企业如何应对高发的供应链安全风险?

编者按&#xff1a;物盾安全是一家专注于物联网安全的产品厂商&#xff0c;其核心产品“物安盾”在能源、制造、交通等多个领域落地&#xff0c;为这些行业企业提供覆盖物联网云、管、边、端的安全整体解决方案。“物安盾”集成了腾讯安全制品扫描&#xff08;BSCA&#xff09;…

【二】kubernetes操作

k8s卸载重置 名词解释 1、Namespace&#xff1a;名称用来隔离资源&#xff0c;不隔离网络 创建名称空间 一、命名空间namesapce 方式一&#xff1a;命令行创建 kubectl create ns hello删除名称空间 kubectl delete ns hello查询指定的名称空间 kubectl get pod -n kube-s…

【Adobe国际认证中文官网】Adobe中国摄影计划,免费安装 正版激活

一直以来国内有非常多的 Adobe 用户&#xff0c;但苦于正版的购买渠道较少、价格较为高昂&#xff0c;转而选择其他国家或地区的 Adobe 计划&#xff0c;亦或者是其他软件。这次Adobe在杭州宣布在中国大陆地区推出面向专业摄影师及摄影爱好者的Adobe Creative Cloud 中国摄影计…

大话数据结构-普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal)

5 最小生成树 构造连通网的最小代价生成树称为最小生成树&#xff0c;即Minimum Cost Spanning Tree&#xff0c;最小生成树通常是基于无向网/有向网构造的。 找连通网的最小生成树&#xff0c;经典的有两种算法&#xff0c;普里姆算法和克鲁斯卡尔算法。 5.1 普里姆&#xff…

技术分享| 如何使用Prometheus实现系统监控报警邮件通知

上一篇关于Prometheus的文章中说到了Prometheus是如何实现进程监控。在实际的线上环境中&#xff0c;当系统进程出现异常后需要实时通知到值班运维人员&#xff0c;去检查系统是否还正常运转。下面我们就介绍下基于Prometheus如何实现监控报警通知。 Prometheus的报警通知&…

【蓝桥杯每日一题】递归算法

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;我与杀戮之中绽放&#xff0c;亦如黎明的花…

【项目】Vue3+TS 动态路由 面包屑 查询重置 列表

&#x1f4ad;&#x1f4ad; ✨&#xff1a;【项目】Vue3TS 动态路由 面包屑 查询重置 列表   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 热烈的不是青春&#xff0c;而是我们&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0…

jsoncpp+cmake使用

目录写在前面准备clone源码编译使用编译运行参考写在前面 1、本文内容 jsoncpp编译及其使用 2、平台 windows10, linux 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/129300456 准备 clone源码 mkdir json cd json git clone https:…

【软件测试】老鸟告诉我内-幕,jmeter性能测试压力测试有多香?薪资真翻2倍......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 压力测试&#xff0…

Composer安装与配置教程

一、windows系统下安装安装Composer教程下载安装php 方法一、下载Composer安装包安装完成后CMD运行 composer --version 命令查看版本号&#xff0c;正常显示版本号则表示安装成功3、方法二、CMD命令安装composer安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行 php…

计算机网络安全基础知识1:渗透测试,网络连接的核心TCP/IP体系结构,公网,内网,ip地址和端口

计算机网络安全基础知识1&#xff1a;渗透测试&#xff0c;网络连接的核心TCP/IP体系结构&#xff0c;公网&#xff0c;内网&#xff0c;ip地址和端口 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去…

frp内网穿透实验

Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器) ←→ 内网…