未见过类型题每周总结(个人向)


1.DP40 小红取数

题目

解析 

一道01背包的衍生问题,我们可以按照它的思路定义数组dp[i][j],表示前i个数中%k为j的最大和。为什么设置未%k的最大和呢?是因为当两个数分别%k,如a%k=x,b%k=y。那么(a+b)%k==(x+y)%k。接下来推动态转移方程,取第i个数时dp[i][j]=dp[i-1][j-arr[i]%k]+arr[i],不取第i个数时dp[i][j]=dp[i-1][j],但是如果j-arr[i]%k<0,那么数组会越界,和普通的01背包不同,我们这里就算它小于0,也是存在意义的,就比如k==3时,arr[i]%3=2,j=1,这说明2加上了2再%3等于1,所以为了让数组不越界并且找到和arr[i]%k相加的那个数,我们把j-arr[i]%k变成(k+j-arr[i]%k)%k,初始化时i为0时除j=0外都为-1,最后输出dp[n][0]。还有一个特殊情况,如果没有任何数相加%k为0则j等于0就一直是0,但是我们要输出-1,所以最后我们要判断如果dp[n][0]为0,则输出-1。

代码

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int k = in.nextInt();long[] arr = new long[n + 1];for (int i = 1; i <= n; i++) {arr[i] = in.nextLong();}//设dp[i][j]表示前i个数中%k为j的最大和//取第i个数时dp[i][j]=dp[i-1][j-arr[i]%k]+arr[i]//不取第i个数时dp[i][j]=dp[i-1][j]//如果j-arr[i]%k<0那就让它等于(k+j-arr[i]%k)%k//所以取第i个数时dp[i][j]=dp[i-1][(k+j-arr[i]%k)%k]+arr[i]//初始化i为0时除j=0外都为-1long[][] dp = new long[n + 1][k];for (int i = 1; i < k; i++) {dp[0][i] = -1;}for (int i = 1; i <= n; i++) {for (int j = 0; j < k; j++) {if (dp[i - 1][(int)((k + j - arr[i] % k) % k)] != -1) {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][(int)((k + j - arr[i] % k) % k)] + arr[i]);} else {dp[i][j] = dp[i - 1][j];}}}//如果到最后%k等于0的位置还为0,那么就说明从头到尾没有数相加能被//k整除,那么就输出1System.out.print(dp[n][0]==0?-1:dp[n][0]);}
}

2.DP16 合唱队形

题目

 解析

用最长上升子序列,以第i个为中心即可,d[i]表示从1到i的最大子序列,p[i]表示从n到i的最大子序列,d[i]=(d[0]到d[i-1]中小于这个数的最大值)+1,p[i]=(p[n]到p[i+1]中小于这个数的最大值)+1,每个数都要和1比,因为自身也有长度。

还有一种解法就是使用我在之前最长上升子序列(二)中运用的方法,贪心+二分查找。这个之前学过,可以去前面看。算是一种时间优化。

代码

解法一:
public class demo2 {//合唱队形public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] arr = new int[n + 1];for (int i = 1; i <= n; i++) {arr[i] = in.nextInt();}//用最长上升子序列,以第i个为中心即可//d[i]表示从1到i的最大子序列//p[i]表示从n到i的最大子序列//d[i]=(d[0]到d[i-1]中小于这个数的最大值)+1//p[i]=(p[n]到p[i+1]中小于这个数的最大值)+1//初始化d[0],p[0]=0;//每个数都要和1比,因为自身也有长度int[] d=new int[n+1];int[] p=new int[n+1];for (int i = 1; i <= n; i++) {d[i] = 1;for (int j = 0; j < i; j++) {if (arr[j] < arr[i]) {d[i] = Math.max(d[i], d[j] + 1);}}}for (int i = n; i >= 1; i--) {p[i] = 1;for (int j = n; j >i; j--) {if (arr[j] < arr[i]) {p[i] = Math.max(p[i], p[j] + 1);}}}int min=0x3f3f3f3f;for(int i=1;i<=n;i++) {min=Math.min(min,n-(d[i]+p[i]-1));}System.out.print(min);}
}
 解法二:
/*** Created with IntelliJ IDEA.* Description:* User: 99715* Date: 2024-06-01* Time: 19:19*/
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class demo3 {//合唱队形(时间优化)public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] arr = new int[n + 1];for (int i = 1; i <= n; i++) {arr[i] = in.nextInt();}//时间优化int[] d = new int[n + 1];int[] p = new int[n + 1];int[] d1 = new int[n + 1];int pos = 0;for (int i = 1; i <= n; i++) {if (pos == 0 || arr[i] > d1[pos]) {d1[++pos] = arr[i];} else {int left = 1, right = pos;while (left < right) {int mid = (left + right) / 2;if (arr[i] > d1[mid]) {left = mid + 1;} else {right = mid;}}d1[right] = arr[i];}d[i] = pos;}int pos2=0;int[] p1=new int[n+1];for (int i = n; i >= 1; i--) {if (pos2 == 0 || arr[i] > p1[pos2]) {p1[++pos2] = arr[i];} else {int left = 1, right = pos2;while (left < right) {int mid = (left + right) / 2;if (arr[i] > p1[mid]) {left = mid + 1;} else {right = mid;}}p1[right] = arr[i];}p[i] = pos2;}int min = 0x3f3f3f3f;for (int i = 1; i <= n; i++) {min = Math.min(min, n - (d[i] + p[i] - 1));}System.out.print(min);}
}

3.小红的子串

题目

解析

这一题的主要思想是滑动窗口,捎带着些前缀和。因为要判断种类在l到r之间的子串数,而这无法直接计算,所以我们使用1到r减去1到l-1来计算。那么我们怎么计算1到x种类之间的字串数呢?我们可以在每次进窗口的时候让ret加上这个数添加的子串个数。子串个数可以用r-l+1表示。如图:

代码

/*** Created with IntelliJ IDEA.* Description:* User: 99715* Date: 2024-06-01* Time: 20:00*/
import java.util.*;
public class demo4 {//小红的字串static char[] arr;static int n;public static void main(String[] args) {Scanner in=new Scanner(System.in);n=in.nextInt();int l=in.nextInt();int r=in.nextInt();arr=in.next().toCharArray();long ret=find(r)-find(l-1);System.out.print(ret);}static long find(int len) {int l=0,r=0,count=0;long ret=0;int[] hash=new int[26];while(r<n) {//进窗口if(hash[arr[r]-'a']++==0) count++;//判断合法以及使其合法while(count>len) {if(--hash[arr[l]-'a']==0) count--;l++;}ret+=r-l+1;r++;}return ret;}
}

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

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

相关文章

C++基础与深度解析 | 类进阶 | 运算符重载 | 类的继承 | 虚函数

文章目录 一、运算符重载二、类的继承1.类的继承2.虚函数 一、运算符重载 在C中&#xff0c;operator关键字用于重载运算符&#xff0c;使得类的实例可以使用内置的操作符&#xff08;如、-、*、/等&#xff09;进行操作。 运算符重载的特性&#xff1a; 重载不能发明新的运算…

通信协议:常见的芯片间通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议&#xff0c;但不会涉及到协议的具体细节。首先说明&#xff0c;芯片间通信方式根据通信时钟的区别可以分为&#xff1a;异步…

上位机图像处理和嵌入式模块部署(f407 mcu中的网络开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和大家想的不太一样&#xff0c;只要mcu当中带有了mac ip&#xff0c;那么就意味着mcu本身支持了网络开发。但是如果需要mcu支持完整的tcp/ip&…

Java面试题:ArrayList底层实现原理、HashMap的实现原理、HashMap的jdk1.7和jdk1.8有什么区别

文章目录 一、List相关面试题1.1 ArrayList源码分析&#xff08;底层实现&#xff09;1.2 ArrayList底层的实现原理是什么1.3 ArrayList listnew ArrayList(10)中的list扩容几次1.4 如何实现数组和List之间的转换1.5 ArrayList 和 LinkedList 的区别是什么 二、HashMap相关面试…

《最游记》游戏全套源码(源码+引擎+文档+客户端+服务端+工具)

《最游记》首款西游降魔修仙网游—还原《西游记》小说经典&#xff0c;华丽场景&#xff0c;玄幻体验&#xff1b;七十二变&#xff0c;机甲配备&#xff1b;仙兵神器&#xff0c;灵兽助阵&#xff1b;降妖除魔&#xff0c;最游天下&#xff01;源码基于 vs 2005&#xff0c;可…

英伟达GPU架构加速狂飙

NVIDIA首席执行官黄仁勋在台湾大学体育馆发表主题演讲&#xff0c;展示了新一代Rubin架构&#xff0c;这是NVIDIA加速推出新架构的最新成果。 在讨论NVIDIA下一代架构时&#xff0c;黄仁勋提到了Blackwell Ultra GPU&#xff0c;并表示它可能会继续升级。然后他透露&#xff0c…

Qt 【Object::connect: No such slot 。。。】解决方法

发生如下所示问题&#xff0c;有三种原因造成&#xff1a; 1.下图中的Q_OBJECT被注释掉或者漏了&#xff08;该问题不常见&#xff09; 2.下图中声明slots漏了&#xff08;新手较常见&#xff09; 3.发生下面两行中的错误&#xff0c;在下面两行代码中仅仅是一个参数名字的区别…

web刷题记录(2)

[鹤城杯 2021]EasyP 就是php的代码审计 从中可以看出来&#xff0c;就是对四个if语句的绕过&#xff0c;然后过滤了一些语句 代码分析&#xff1a; 通过include utils.php;导入了一个叫做"utils.php"的文件&#xff0c;这意味着在该文件中可能定义了一些与本代码相…

模型训练篇 | yolov10来了!手把手教你如何用yolov10训练自己的数据集(含网络结构 + 模型训练 + 模型推理等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv9还没捂热乎&#xff0c;YOLOv10就推出来了&#xff0c;太卷了&#xff0c;太快了&#xff0c;坐等YOLOv9000&#xff01;自今年2月YOLOv9发布之后&#xff0c; YOLO&#xff08;You Only Look Once&#xff09;系列的…

全域外卖平台是什么?有哪些系统可以推荐?

随着本地生活下半场的开启&#xff0c;以团购外卖为代表的一系列相关业务也迈入了全域时代。在此背景下&#xff0c;全域外卖赛道正式兴起&#xff0c;全域外卖平台也随之备受瞩目。 作为创业的一大新风口&#xff0c;全域外卖囊括了公域和私域内所有的外卖业务&#xff0c;主…

基础篇03——SQL约束

概述 约束示例 完成以下案例&#xff1a; create table user (id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age tinyint unsigned check ( age > 0 and age < 120 ) comment 年龄,status char(1) default 1 commen…

嵌入式C语言--Pragma Section与Map文件

嵌入式C语言–Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件一. Pragma修饰符二. Map文件1&#xff09;什么是map文件2&#xff09;map文件的构成3&#xff09;常用的段映射地址4&#xff09;map文件生成 三. Section修…

SpaceX: 太空火箭自主精准着陆

本文是根据Lars Blackmore在16年的一篇公开论文翻译而来&#xff0c;虽然有些早而且是科普文章&#xff0c;但是可以初见一些SpaceX火箭着陆的细节&#xff0c;后面我会对spaceX landing control 技术主管MIT博士期间研究火箭控制算法的论文进行讲解&#xff0c;敬请期待。 Lar…

OpenEuler华为欧拉系统安装—从零开始,小白也能学会

介绍 openEuler&#xff08;欧拉&#xff09;是一款开源操作系统。 当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c; 能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、 稳定、安全的开源操作系统&#xff0c;适用于数据库…

JVM运行数据区-Java堆

Java堆 堆区&#xff08;Heap区&#xff09;是JVM运行时数据区占用内存最大的一块区域&#xff0c;每一个JVM进程只存在一个堆区&#xff0c;它在JVM启动时被创建&#xff0c;JVM规范中规定堆区可以是物理上不连续的内存&#xff0c;但必须是逻辑上连续的内存。 1、堆区是线程…

「网络编程」基于 UDP 协议实现回显服务器

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现回显服务器 &#x1f349;socket api&#x1f349;回显服务器&#x1f34c;实现&#x1f95d;服务器&#x1f95d;客户端 &#x1f3…

纯血鸿蒙实战开发—如何添加顶部tab页面

1.Tabs组件 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏. 根据不同的导航类型&#xff0c;布局会有区别&#xff0c;可以分为底部导航、顶部导航、侧边导航&#xff0c;其导航栏分别位于底部、顶…

react基础学习 JSX

JSX的测试网站 Babel Babel 可以测试代码的效果 JSX实现map列表 注意 key不一样&#xff08;使用遍历的时候&#xff09; 简单条件渲染 复杂条件渲染 绑定事件 function App() {const colorse (e)>{console.log("测试点击",e);}const colorse1 (name)>{…

地理信息科学中的大数据挑战

在信息化爆炸的时代&#xff0c;地理信息科学&#xff08;GIScience&#xff09;正经历着前所未有的变革&#xff0c;其中&#xff0c;地理空间大数据的涌现为科学研究与应用带来了前所未有的机遇与挑战。作为地理信息与遥感领域的探索者&#xff0c;本文旨在深入剖析地理空间大…

揭秘HubSpot集客营销:如何吸引并转化全球潜在客户

随着全球数字化浪潮的推进&#xff0c;企业出海已经成为许多公司扩大市场、增加品牌曝光度的重要战略。HubSpot集客营销作为一种以客户为中心、数据驱动的营销策略&#xff0c;为企业在海外市场的成功提供了强有力的支持。作为HubSpot亚太地区的合作伙伴&#xff0c;NetFarmer将…