算法简单笔记4

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位数字自己就是一个数组的时候的长度就是1long 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.mzph.cn/news/845426.shtml

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

相关文章

零基础学会asp.net做AI大模型网站/小程序之五:实战初体验(简单网站教学--动态网页制作)

关注我,持续分享逻辑思维&管理思维&面试题; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 博主在互联网大厂深耕近二十年,从一线码农做起,到人工智能公司副总裁。希望把过往经验总结出来,帮助到更多同学。有兴趣可关注博主后加个人微信(平台规定文章…

深度学习聚类再升级!新算法实现强悍性能,准确率超98%

深度聚类不仅继承了传统聚类算法的优点&#xff0c;在对高维和非线性数据的处理能力&#xff0c;以及自适应性和抗噪性方面也具有很大优势。 具体来说&#xff0c;结合深度学习的聚类算法通过利用深度神经网络的强大特征提取能力&#xff0c;自动学习和识别数据中的复杂结构和…

lru_cache 装饰器的作用

lru_cache 装饰器的主要作用是缓存函数的结果&#xff0c;以减少不必要的计算。在您的代码中&#xff0c;lru_cache(maxsizeNone) 装饰器被用于 load_model 函数。这意味着当 load_model 函数被多次调用&#xff0c;且参数 model_path 相同时&#xff0c;函数的结果会被缓存&am…

全志H616(BIGTREETECH CB1)和 博通BCM2711(树莓派4B)CPU对比测试

一&#xff0c;实物对比图&#xff1a; BIGTREETECH CB1的底板接口的分布和树莓派4B是一样的&#xff0c;但是没有树莓派的音频接口&#xff0c;底板也不能放到树莓派4B的官方外壳里&#xff0c;因为底板的背面有一个DSI接口&#xff0c;高度超出了。 二&#xff0c;开发板硬…

HBSL-22Q/K定时限过电流继电器 板前接线 JOSEF约瑟

HBSL系列静态定时限过电流继电器 系列型号&#xff1a; HBSL-11A/E静态定时限过电流继电器&#xff1b;HBSL-11A/K静态定时限过电流继电器&#xff1b;HBSL-12A/E静态定时限过电流继电器&#xff1b; HBSL-12A/K静态定时限过电流继电器&#xff1b;HBSL-21A/E静态定时限过电…

JS-09-es6常用知识1

目录 1 模板字符串 1.1 模板字符串基本用法 1.2 模板字符串解决了一些痛点 2 解构赋值 2.1 对象的解构赋值 2.2 函数参数的解构赋值 2.3 补写&#xff1a;属性的简写 3 rest参数 3.1 arguments 3.2 rest参数 3.3 补充&#xff1a;判断数据类型 4 箭头函数 4.1 …

SpringBoot-世界杯足球赛网站-28567

Springboot世界杯足球赛网站 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对世界杯足球赛…

jsmug:一个针对JSON Smuggling技术的测试PoC环境

关于jsmug jsmug是一个代码简单但功能强大的JSON Smuggling技术环境PoC&#xff0c;该工具可以帮助广大研究人员深入学习和理解JSON Smuggling技术&#xff0c;并辅助提升Web应用程序的安全性。 背景内容 JSON Smuggling技术可以利用目标JSON文档中一些“不重要”的字节数据实…

C++ 特殊运算符

一 赋值运算符 二 等号作用 三 优先级和结合顺序 四 左值和右值 五 字节数运算符 条件运算符 使用条件运算符注意 逗号运算符 优先级和结合顺序 总结

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…

【linux】docker下nextcloud安装人脸识别插件2

接上文 【linux】docker下nextcloud安装人脸识别插件-CSDN博客 由于作者不再维护此插件&#xff0c;转而开发新的插件 recognize &#xff0c;因此同步更新插件使用教程。 1、下载人脸识别app&#xff1a;recognize Recognize - Apps - App Store - Nextcloud 2、将插件recog…

Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java中&#xff0c;可以使用各种库来解析和操作JSON数据。其中&#xff0c;Gson和Jackson是两个非常流行且功能强大的库。在这篇文章中&#xff0c;将使用Gson库来解析给定的JSON字符串&#xff0c;修改operationB…

python移位操作符(左移位操作符<<、右移位操作符>>)(允许开发者对整数进行位操作,乘2或除2)(左移操作、右移操作)(位掩码操作|=)

文章目录 Python 中的移位操作符详解移位操作符简介左移位操作符 (<<)语法和使用示例代码输出 右移位操作符 (>>)语法和使用示例代码输出 移位操作符的应用场景快速乘除运算&#xff1a;使用移位操作符代替传统的乘法和除法运算&#xff0c;可以提高计算速度。位掩…

生产问题(十六)数据丢失-mysql binlog排查

一、引言 最近作者遇到一个线上问题&#xff0c;是mysql 的数据丢失了&#xff0c;这里记录一下排查过程和binlog的分析。 二、问题 问题出现的表象是应用系统大量报错&#xff0c;各种空指针之类的&#xff0c;这种一看就不可能是代码发布的问题&#xff0c;原因一定在框架、…

js 纯前端实现数组分页、列表模糊查询、将数组转成formdata格式传给接口

后端返回所有的数据&#xff0c;由前端来实现分页展示、模糊查询&#xff0c;并将数组格式转成formdata格式给后端 1、数组转formdata let formData new FormData()for (let i 0; i < list.length; i) {let item list[i];for (let property in item) {formData.append(…

可能会引起空指针

PreparedStatement preparedStatement null; preparedStatement conn.prepareStatement(sql); 如果直接下面这个可能会赋值给空指针 因为要在try{}和catch{}里面都用,所以要定义在try外面为null //如果只是测试,可以PreparedStatement preparedStatement conn.prepareSta…

第十八节:认识一些经典递归过程

一 暴力递归就是尝试 1&#xff0c;把问题转化为规模缩小了的同类问题的子问题 2&#xff0c;有明确的不需要继续进行递归的条件(base case) 3&#xff0c;有当得到了子问题的结果之后的决策过程 4&#xff0c;不记录每一个子问题的解 二 打印n层汉诺塔从最左边移动到最右边的全…

分形之科赫雪花

前言 分形是一种具有自相似性的几何图形或数学对象。它的特点是无论在任何放大或缩小的尺度下,都能够看到与整体相似的图形。分形的形状可以非常复杂,常常具有分支、重复的图案,以及细节层次丰富的结构。 分形在自然界中广泛存在,如云朵、树枝、山脉、海岸线等,它们都展…

vue 动态url

window location herf vue 官方文档 vue 传参 vue-router 官方文档 动态参数 /runninghistory/:id import { useRoute, useRouter } from vue-routersetup语法糖 setup 语法糖与选项式Api 有所不同&#xff0c; const route useRoute() console.log(route.params.id) Op…

Java常用API(三)

一、Arrays类 1.定义 Arrays是一个用于操作数组的工具类。 2.常用方法 1.toString方法 public class Demo {public static void main(String[] args) {//toString 将数组变成字符串int[] arr {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};System.out.println(Arrays.toString(arr));…