算法日记 35 day 动态规划

devtools/2024/11/29 3:20:44/

今天都是些比较简单的题,看看题目吧。

题目:最长递增子序列

300. 最长递增子序列 - 力扣(LeetCode)

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列

 题目分析:

        五部曲走起。dp[i]表示从0-i的区间内,最长的递增子序列长度为dp[i]。递推公式:

位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。

所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);初始化全为1即可。

public class Solution {public int LengthOfLIS(int[] nums) {if(nums.Length<=1) return nums.Length;int[] dp=new int[nums.Length];Array.Fill(dp,1);int res=0;for(int i=1;i<nums.Length;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j]){dp[i]=Math.Max(dp[i],dp[j]+1);}}if(dp[i]>res) res=dp[i];}return res;}
}

题目:最长连续递增序列

674. 最长连续递增序列 - 力扣(LeetCode)

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 rl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

 题目分析:

        同样是求解递增序列,不过本题要求连续,这意味着一个状态必定是由他的上一个状态改变过来的。dp[i]表示从0-i的区间内,最长的连续递增序列长度为dp[i]。递推公式:

如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。

即:dp[i] = dp[i - 1] + 1;

public class Solution {public int FindLengthOfLCIS(int[] nums) {if(nums.Length<=1) return nums.Length;int[] dp=new int[nums.Length];Array.Fill(dp,1);int res=1;for(int i=1;i<nums.Length;i++){if(nums[i]>nums[i-1]){dp[i]=dp[i-1]+1;}res=Math.Max(res,dp[i]);}return res;}
}

题目:最长重复子数组

718. 最长重复子数组 - 力扣(LeetCode) 

给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。 

题目分析: 

        两个数组,自然就需要考虑二维dp数组了。需要注意的是子数组需要连续,而序列不需要连续。

        dp[i][j]:表示0-i的num1和0-j的num2的最长重复子数组为dp[i,j]

        递推公式:dp[i][j] = dp[i - 1][j - 1] + 1;

        初始化:根据定义需要对第一行和第一列进行初始化,相同值初始化为1.可以画图看看。

public class Solution {public int FindLength(int[] nums1, int[] nums2) {//表示0-i的num1和0-j的num2的最长重复子数组为dp[i,j]int[,] dp=new int[nums1.Length,nums2.Length];for(int i=0;i<nums1.Length;i++){//初始化第一列if(nums1[i]==nums2[0]) dp[i,0]=1;}for(int i=0;i<nums2.Length;i++){//初始化第一行if(nums2[i]==nums1[0]) dp[0,i]=1;}int res=0;for(int i=0;i<nums1.Length;i++){for(int j=0;j<nums2.Length;j++){if(nums1[i]==nums2[j]&&i>0&&j>0){dp[i,j]=dp[i-1,j-1]+1;}res=Math.Max(res,dp[i,j]);}}return res;}
}

其实,dp数组的含义也可以表示为0-(i-1)的num1和0-(j-1)的num2的最长重复子数组为dp[i,j]

这样表示的话,就不需要对第一行和第一列进行额外的初始化,不过遍历时i和j需要从1开始。

对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。

代码随想录 (programmercarl.com)

已刷题目:116

http://www.ppmy.cn/devtools/137818.html

相关文章

英语知识在线学习:Spring Boot网站设计

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

Zabbix 7.0 LTS Docker Compose 部署指南与遇到问题解决

Zabbix 7.0 LTS Docker Compose 部署指南与遇到问题解决 摘要 本文详细介绍了如何使用Docker Compose部署Zabbix 7.0 LTS版本,并提供了针对常见部署问题的解决方案。主要内容包括: 完整的docker-compose.yml配置文件,包含Zabbix服务器、Web界面、Agent、Java Gateway和MyS…

基于数据融合的智能家居环境监测系统研究与设计(论文+源码)

1总体方案设计 本次基于数据融合的智能家居环境监测系统的设计&#xff0c;其系统总体架构如图2.1所示&#xff0c;整个系统在器件上包括了主控制器STM32F103单片机&#xff0c;MQ可燃气体传感器&#xff0c;光照传感器&#xff0c;DHT11温湿度传感器&#xff0c;风扇&#xf…

Spring MVC:原理、配置与基础应用详解

一、引言 在现代 Java 企业级开发领域&#xff0c;Spring MVC 作为 Spring 框架家族中专注于构建 Web 应用的核心模块&#xff0c;凭借其强大、灵活且高效的特性&#xff0c;占据着举足轻重的地位。它遵循经典的 MVC&#xff08;Model-View-Controller&#xff09;设计模式&…

基于python的长津湖评论数据分析与可视化,使用是svm情感分析建模

引言 研究背景及意义 上世纪初开始&#xff0c;中国电影就以自己独有的姿态登上了世界电影史的舞台。中国电影作为国家文化和思想观念的反映与延伸&#xff0c;能够增强文化自信&#xff0c;在文化输出方面有着极其重要的作用1[1]。 改革开放以来&#xff0c;随着生产力的提高…

追寻红色足迹,领略西湖古韵今风|中共杭州美创科技有限公司支部党建活动纪实

11月23日&#xff0c;为深入推进党员思想政治教育&#xff0c;大力弘扬红色文化&#xff0c;传承革命先辈不朽精神&#xff0c;中共杭州美创科技有限公司支部于精心组织了一场主题为“追寻红色足迹&#xff0c;领略西湖古韵今风”的党建活动。此次活动以实地学习与亲身体验相结…

【设计模式】1. 构建器模式(Builder Pattern)是一种创建型设计模式

构建器模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于分步骤构建复杂对象&#xff0c;同时允许按照不同的需求生成不同的表示。该模式将对象的构建过程与其表示分离&#xff0c;使得相同的构建过程可以创建不同的对象。 核心思想 构建器模…

解锁 Vue 项目中 TSX 配置与应用简单攻略

在 Vue 项目中配置 TSX 写法 在 Vue 项目中使用 TSX 可以为我们带来更灵活、高效的开发体验&#xff0c;特别是在处理复杂组件逻辑和动态渲染时。以下是详细的配置步骤&#xff1a; 一、安装相关依赖 首先&#xff0c;我们需要在命令行中输入以下命令来安装 vitejs/plugin-v…