算法简单笔记4

news2025/2/28 17:39:51

5月31号,明天决赛,今天脑子也是一滩浆糊,踏马的一道题也做不出来,超级难受,只好简单复盘一下两道之前的题目,看完就差不多了,再学也没啥用了,写完这两题题解我就回去打把steam绝地求生,听天由命等死吧

复盘之前基础题:

一、经典动态规划:最长递增子序列

很基础的动态规划题,思路如下:

我们遍历整个数组,每遍历到第 i 位,我们就把【从第0位 ~ 第i位作为一个新数组,来计算以这个第 i 位为结尾的数组里,可以第 i 位组成最长递增子序列的长度是多少

我们用一个dp[ ]数组记录下每一个第 i 位结尾的最长递增子序列的长度是多长

那么我们知道,假如 j < i,如果 “第 j 位的数 < 第 i 位的数” ,那么第 i 位的数就可以跟【第 j 位为结尾的最长递增子序列】组成一个新的最长子序列

那这个【第 i 位为结尾的最长递增子序列的长度就等于 ——>【第 j 位为结尾的最长递增子序列的长度+1

完整代码:

import java.util.Arrays;
import java.util.Scanner;

public class 最长递增子序列 {
    public static void main(String[] args){
        //我这里懒得按照题目要求输入了,直接输入原数组序列,知道逻辑就行
        Scanner in = new Scanner(System.in);
        System.out.print("请输入这个数组有几个成员:");
        int n = in.nextInt();
        System.out.print("请输入这"+n+"个数字:");
        long []a = new long[n];
        for (int i = 0; i < n; i++) {
            a[i] = in.nextLong();
        }

        long[] dp = new long[n];
        Arrays.fill(dp,1);//全部初始化为1,也就是每个第i位数字自己就是一个数组的时候的长度就是1

        long maxLength = 1;//记录最大递增子序列的
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if(a[j] < a[i]){
                    dp[i] = Math.max(dp[i] , dp[j]+1);
                }
            }
            maxLength = Math.max(maxLength , dp[i]);
        }

        System.out.println(maxLength);
    }
}

二、经典动态规划:最长递增子序列的个数

在上一题的基础要统计个数,看似烧脑麻烦,但其实多写几组样例还是能看出简单的规律的

思路:

1、我们除了用dp[ ]数组记录每一个的最长子序列的长度以外,再设一个count[ ]数组,记录每一个【第 i 位为结尾的数组】有几个最长递增子序列

2、如果dp[ j ] + 1 > dp[ i ],那么就说明【第 j 位为结尾的最长递增子序列】可以跟【第 i 位】组成新的最长子序列,那么第 j 位有几个最长递增子序列,第 i 位也就跟他一样有几个

即:count[i] = count[j]

趣味理解:j 有N个最长递增子序列,那我 i 是他爹,我更应该也有N个)

3、如果dp[ j ] + 1 == dp[ i ],那么就说明找到了相同长度的递增子序列,那么就应该在count[ i ]原来最多有N条的最长子序列的基础上,再加上count[ j ]拥有的最多的递增子序列

即:count[i] += count[j]

趣味理解:j 跟 j+1 都有10万块,那我CEO在本来就有15万的基础上,也要再加10万块)

4、不过还是要建立在a[ j ] < a[ i ]的情况,你都不比他大就说明你们凑不成一个递增子序列

5、但是因为我们根据dp[ j ] + 1 > dp[ i ] 和 dp[ j ] + 1 == dp[ i ]来更新最多的递增子序列的个数,那么我们只能获取到“【以i为结尾的】、【最后长度最长】”的递增子序列的个数,但是要知道最后结尾的数也可能不止一个

按照这个例子,那么我们实际想要的是【以7为结尾的最长子序列】2个 + 【以6为结尾的最长子序列】2个 = 4个!!

那么就还得用一个【maxLength】记录下最长子序列的长度

然后遍历dp[ ]数组,找到最后长度是最长子序列长度的位置if (dp[ i ] == maxLength)

然后把这些位置为结尾的拥有的最长子序列的个数累加resulet += count[ i ]

最后这个result才是整个原数组拥有的最长递增子序列的个数

趣味理解:最后两个同级别的CEO大佬,都掌握2亿资产,那么它两加起来的4亿才是这个公司最屌工资的总数)

完整代码:

import java.util.*;
public class 最长递增子序列的个数 {
    public static void main(String[] args){
        //我这里懒得按照题目要求输入了,直接输入原数组序列,知道逻辑就行
        Scanner in = new Scanner(System.in);
        System.out.print("请输入这个数组有几个成员:");
        int n = in.nextInt();
        System.out.print("请输入这"+n+"个数字:");
        long []a = new long[n];
        for (int i = 0; i < n; i++) {
            a[i] = in.nextLong();
        }

        long[] dp = new long[n];
        long[] count = new long[n];

        Arrays.fill(dp,1);
        Arrays.fill(count,1);

        long maxLength = 0;//记录最大递增子序列的

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if(a[j] < a[i]){
                    if(dp[j]+1 > dp[i]){
                        dp[i] = dp[j]+1;
                        count[i] = count[j];
                    } else if (dp[j]+1 == dp[i]) {
                        count[i] += count[j];
                    }
                }
            }
            maxLength = Math.max(maxLength , dp[i]);
        }

        long result = 0;
        for (int i = 0; i < n; i++) {
            if(dp[i] == maxLength){
                result += count[i];
            }
        }
        System.out.println(result);
    }
}

不写了玛德,心烦了,只想吃个鸭腿跟热卤,回去打两把游戏睡觉

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

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

相关文章

AI大模型的生命周期:从开发到退役的全面解析

前言 人工智能大模型&#xff08;AI大模型&#xff09;是当前AI领域的一大热点&#xff0c;它们具有强大的计算能力和广泛的应用前景。本文将全面介绍AI大模型的基础知识、训练过程、使用方法和应用场景。 一、初步了解AI大模型 AI大模型&#xff0c;通常指的是参数量达到亿…

k8s——Pod进阶(资源限制和探针)

一、资源限制 1.1 资源限制的定义 当定义Pod时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是CPU和内存大小&#xff0c;以及其他类型的资源。 当为Pod中的容器指定了request资源时&#xff0c;调度器就使用该信息来决定将Pod调度到哪个节点上。当还为容器…

5.29工效学-人因工程人机交互

对于工效学这门课&#xff0c;一直都感觉很有意思&#xff0c;是一个值得再认真一点的课。可惜上课的时候效率不高&#xff0c;有感兴趣的东西课后也没有自行去拓展开来&#xff0c;前面的课我感觉还讲了比较重要的东西&#xff0c;但是&#xff0c;全忘了呢&#xff08;真的对…

【C++】入门(二):引用、内联、auto

书接上回&#xff1a;【C】入门&#xff08;一&#xff09;&#xff1a;命名空间、缺省参数、函数重载 文章目录 六、引用引用的概念引用的使用场景1. 引用做参数作用1&#xff1a;输出型参数作用2&#xff1a;对象比较大&#xff0c;减少拷贝&#xff0c;提高效率 2. 引用作为…

无忧易售ERP:解锁TikTok平台订单处理新效能,赋能跨境电商新未来

在这个全球化电商飞速发展的时代&#xff0c;TikTok作为新兴的电商蓝海&#xff0c;正吸引着无数商家的目光。然而&#xff0c;如何在竞争激烈的市场中脱颖而出&#xff0c;高效管理订单&#xff0c;提升顾客体验&#xff0c;成为每个商家必须面对的课题。无忧易售ERP&#xff…

uni-app+php 生成微信二维码 分销海报

主要代码如下&#xff0c;可直接复制调试参数&#xff1a; //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…

一文搞懂分布式事务-Saga

Saga定义 Saga模式是一种分布式事务处理模式&#xff0c;用于保证分布式系统中的一系列操作要么全部成功执行&#xff0c;要么全部回滚&#xff0c;以实现一致性的目标。它采用了长事务的概念&#xff0c;将原子操作拆分为多个子事务&#xff0c;并通过补偿机制保证整个事务的…

Linux基本命令的使用(mkdir)

一、Linux必备命令之mkdir • mkdir命令主要用于创建目录 • 语法: mkdir [选项] 目录名称 若指定目录不存在则创建目录&#xff1b; 选项&#xff1a; -p&#xff0c;--parents 需要时创建目录的上层目录&#xff0c;若这些 目录已存在也不当作错误处理 二、Linux必备命令之…

成绩发布小程序哪个好用?

大家好&#xff0c;今天我要来跟大家分享一个超级实用的小秘密——易查分小程序&#xff01;作为老师&#xff0c;你是不是还在为发放成绩而头疼&#xff1f;是不是还在为通知家长而烦恼&#xff1f;别急&#xff0c;易查分小程序来帮你啦&#xff01; 易查分简直是老师们的贴心…

实战经验分享之移动云快速部署Stable Diffusion SDXL 1.0

本文目录 前言产品优势部署环境准备模型安装测试运行 前言 移动云是中国移动面向政府、企业和公众的新型资源服务。 客户以购买服务的方式&#xff0c;通过网络快速获取虚 拟计算机、存储、网络等基础设施服务&#xff1b;软件开发工具、运行环境、数据库等平台服务&#xff1…

活动选择问题(贪心法)

目录 问题概述 实例分析 代码实现 问题概述 实例分析 求解蓄栏保留问题。农场有n头牛,每头牛会有一个特定的时间区间[b,e]在蓄栏里挤牛奶,并且一个蓄栏里任何时刻只能有一头牛挤奶。现在农场主希望知道最少蓄栏能够满足上述要求,并给出每头牛被安排的方案。对于多种可行方案…

【算法】贪心算法简介

贪心算法概述 目录 1.贪心算法概念2.贪心算法特点3.贪心算法学习 1.贪心算法概念 贪心算法是一种 “思想” &#xff0c;即解决问题时从 “局部最优” 从而达到 “全局最优” 的效果。 ①把解决问题的过程分为若干步②解决每一步时候&#xff0c;都选择当前最优解(不关注全局…

如何编写一份高质量的渗透测试报告?

随着网络安全威胁的不断扩展与升级&#xff0c; 渗透测试目前已经成为众多组织主动识别安全漏洞与潜在风险的关键过程。然而&#xff0c;渗透测试的真正价值在于为用户提交一份全面和可操作的渗透测试报告&#xff0c;这份报告不仅仅是一个技术性文档&#xff0c;同时也是促进安…

c语言基础:数组的运用以及在内存中的地址的理解

目录 目录&#xff1a; 1.数组作为函数参数 2.数组在内存中的存储 2.1数组名是什么&#xff1f; 2.2下面我们来探讨二维数组的各个名字表示什么 二维数组的首元素地址是什么呢&#xff1f; *arr表示的是什么呢 &#xff1f;&#xff08;arr是二维数组&#xff09; 1.数组作…

纯分享#126个电商平台集合(包含60个不同国家)值得一看

01 亚洲 中国 淘宝&#xff1a;拥有大量的卖家和商品种类&#xff0c;主要面向中国市场。天猫:淘宝旗下的B2C电商平台&#xff0c;提供品质保证、正品保障的商品。京东:中国第二大B2C电商平台&#xff0c;提供品质保证、正品保障的商品。苏宁易购: 中国家电连锁巨头苏宁旗下的…

玩机进阶教程------修改gpt.bin分区表地址段 完全屏蔽系统更新 fast刷写分区表 操作步骤解析【二】

上期博文简单说明了分区表的基本常识。我们在有些环境中需要屏蔽手机的系统更新选项。除了以前博文中说明的修改系统更新下载文件夹的方法。还可以通过修改分区表类达到目的。在一些辅助维修工具上面带修改分区表功能。修改后效果为屏蔽系统更新和可以恢复出厂。原则上不深刷都…

STP----生成树协议

目的&#xff1a;解决二层环路问题 跨层封装 广播风暴---广播帧在二层环路中形成逆时针和顺时针转动环路&#xff0c;并且无限循环&#xff0c;最终造成设备宕机&#xff0c;网络瘫痪。 MAC地址表的翻摆&#xff08;漂移&#xff09;---同一个数据帧&#xff0c;顺时针接收后记…

pytorch学习笔记2

首先如果遇到conda找不到包&#xff0c;pip老是超时的情况建议添加一下镜像源 conda的 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ cond…

将 cuda kernel 编译成 ptx 和 rocm的hip asm

1&#xff0c;cuda 源码编译 cuda_a_one.cu __global__ void NNNNNVVVVV_one(int *A) {A[333] 777; }编译命令&#xff1a; %.ptx: %.cu nvcc -archsm_70 -ptx $< -o $ 生成的结果&#xff1a; 2, hip 源码编译 hip_a_one.hip__global__ void AAAAAMMMMM_one(int *A…

docker安装Mysql5.7版本

首先Linux系统已经安装好了docker应用。 1.搜索镜像 docker search mysql 2.拉取5.7的镜像 总之,选starts最多的那个就对了。 docker pull mysql:5.7 ~ docker pull mysql:5.7 5.7: Pulling from library/mysql fc7181108d40: Downloading [============> …