刷题之动态规划-子序列

前言

大家好,我是jiantaoyab,开始刷动态规划的子序列类型相关的题目,子序列元素的相对位置和原序列的相对位置是一样的

动态规划5个步骤

  1. 状态表示 :dp数组中每一个下标对应值的含义是什么>dp[i]表示什么
  2. 状态转移方程: dp[i] 等于什么
  3. 1 和 2 是动态规划的核心步骤,第三步是初始化,保证填表的时候不越界
  4. 填表顺序:为了保证填写当前状态的时候,所需要的状态已经计算过
  5. 返回值

最长递增子序列

image-20240403095425098

题目分析

image-20240403105502701

代码

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1);int ret = 1;for(int i = 1; i < n; i++){for(int k = 0; k < i; k++){if(nums[k] < nums[i])dp[i] = max(dp[k] + 1, dp[i]);}ret = max(ret, dp[i]);}return ret;}
};

摆动序列

image-20240404090127835

代码

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();vector<int> f(n, 1); vector<int> g(n, 1);int ret = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i])//递增f[i] = max(f[i],  g[j] + 1); else if(nums[j] > nums[i])//递减 g[i] = max(g[i],  f[j] + 1);}   ret = max(f[i], g[i]);}return ret ;}
};

最长递增子序列的个数

image-20240404094248815

题目分析

image-20240404102615870

代码

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {int n = nums.size();vector<int> len(n, 1);vector<int> count(n, 1);int ret_len = 1, ret_count = 1;for(int i = 1; i < n; i++){for(int k = 0; k < i; k++){if(nums[k] < nums[i]) {if(len[k] + 1 == len[i]) count[i] += count[k];else if(len[k] + 1 > len[i]){len[i] = len[k] + 1 ; count[i] = count[k];}}                 }//更新返回值if(ret_len == len[i]) ret_count += count[i];else if(ret_len < len[i]) ret_len = len[i], ret_count = count[i];}return  ret_count;}
};

最长数对链

image-20240404103433761

题目分析

dp[i]: 表示以i位置为结尾的最长数对链的长度

在(0,i-1)中取一个j,是数对链的话得满足pairs[j] [1] < pairs[i] [0]

代码

class Solution {
public:int findLongestChain(vector<vector<int>>& pairs) {int m = pairs.size();vector<int> dp (m, 1);sort(pairs.begin(), pairs.end());int ret = 1;for(int i = 1; i < m; i++){for(int j = 0; j < i; j++){if(pairs[j][1] < pairs[i][0])dp[i] = max(dp[j] + 1, dp[i]);}ret = max(ret, dp[i]);}return ret;}
};

最长定差子序列

image-20240405082954751

题目分析

image-20240405090140474

代码

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n  = arr.size();unordered_map<int, int> hash; //<arr[i], dp[i]>int ret = 1;//初始化hash[arr[0]] = 1;for(int i = 1; i < n; i++){hash[arr[i]] = hash[arr[i] - difference] + 1;ret = max(ret, hash[arr[i]]);}return ret;}
};

最长的斐波那契子序列的长度

image-20240406175144571

题目分析

image-20240406185244342

代码

class Solution {
public:int lenLongestFibSubseq(vector<int>& arr) {int n = arr.size();vector<vector<int>> dp(n, vector<int>(n, 2));unordered_map<int, int> hash;//将arr中的值和下标绑定起来for(int i = 0; i < n; i++) hash[arr[i]] = i;int ret = 2;for(int j = 2; j < n; j++) //固定最后一个位置{for(int i = 1; i < j; i++) //固定倒数第二个位置{int x = arr[j] - arr[i];if(hash.count(x) && x < arr[i]) {dp[i][j] = dp[hash[x]] [i]+ 1;ret = max(ret, dp[i][j]);}}}return ret < 3 ?  0  : ret;}
};

最长等差数列

image-20240407082524850

题目分析

image-20240407091840789

代码

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int n = nums.size();unordered_map<int, int> hash; //放nums元素对应的下标hash[nums[0]] = 0;int ret = 2;vector<vector<int>> dp(n,  vector<int>(n, 2));for(int i = 1; i < n; i++) //固定倒数第2个数{for(int j = i + 1; j < n; j++) //依次枚举倒数第一个数{int x = 2 * nums[i]  - nums[j];if(hash.count(x)) dp[i][j] = dp[hash[x]][i] + 1;ret = max(ret,  dp[i][j]);}hash[nums[i]] = i;}return ret;}
};

等差数列划分 II - 子序列

image-20240407092146451

题目分析

image-20240407100137814

代码

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();unordered_map<long long, vector<int>> hash; //存放nums元素对应的下标for(int i = 0; i < n; i++) hash[nums[i]].push_back(i); //每个元素的下标可能有多个vector<vector<int>> dp(n, vector<int>(n));int ret = 0;for(int j = 2; j < n; j++) //固定最后一个位置{for(int i = 1; i < j; i++) //依次遍历倒数第二个位置{long long x = (long long)2 * nums[i] - nums[j];if(hash.count(x)) {//提取出nums[i]的下标for(auto k : hash[x]){if(k < i) dp[i][j] += dp[k][i] + 1;}}ret += dp[i][j];}}return ret;}
};

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

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

相关文章

RAG基础知识及应用

简单介绍下RAG的基础知识和RAG开源应用 “茴香豆" 一. RAG 基础知识 1. RAG工作原理 RAG是将向量数据库和大模型问答能力的有效结合&#xff0c;从而达到让大模型的知识能力增加的目的。首先将知识源存储在向量数据库中&#xff0c;当提出问题时&#xff0c;去向量数据库…

Redis中的集群(一)

集群 概述 Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片(sharding)来进行数据共享&#xff0c;并提供复制和故障转移功能 节点 一个Redis集群通常由多个节点(node)组成&#xff0c;在刚开始的时候&#xff0c;每个节点都是相互独立的&#xff0c;它们都…

电脑开机启动项设置

电脑开机启动项设置 一、Windows 系统&#xff1a; 1、Windows 系统&#xff0c;可以通过【系统配置实用程序】来设置开机启动项&#xff1a; 1&#xff09;、按【WinR】组合键&#xff0c;打开【运行】对话框。 2&#xff09;、输入【msconfig】&#xff0c;点击【确定】或…

4.2C++

写一个char类型的字符数组&#xff0c;对该数组访问越界时抛出异常&#xff0c;并做处理。 #include <iostream>using namespace std; void fun(char (&a)[10],int i) {if(i>10){throw int();}else if(aNULL){throw double();}cout<<"访问了第"&…

K8s学习八(配置与存储_配置)

配置与存储 配置管理 ConfigMap ConfigMap的创建 一般用于去存储 Pod 中应用所需的一些配置信息&#xff0c;或者环境变量&#xff0c;将配置于 Pod 分开&#xff0c;避免应为修改配置导致还需要重新构建 镜像与容器。configmap缩写为cmkubectl create cm -h来查看创建命令…

前端二维码工具小程序产品使用说明书

一、产品概述 前端二维码工具小程序是一款便捷实用的二维码生成与识别工具&#xff0c;通过本小程序&#xff0c;用户可以轻松根据文本或链接生成二维码&#xff0c;并支持扫一扫功能识别二维码内容&#xff0c;同时提供复制识别内容的功能。此外&#xff0c;本小程序还具备美…

在NBA我需要翻译--适配器模式

1.1 在NBA我需要翻译&#xff01; "你说姚明去了几年&#xff0c;英语练出来了哦&#xff0c;我看教练在那里布置战术&#xff0c;他旁边也没有翻译的&#xff0c;不住点头&#xff0c;瞧样子听懂没什么问题了。" "要知道&#xff0c;最开始&#xff0c…

xilinx SATA GTY PHY适配

xilinx sata phy主要是通过transceiver IP 进行移植&#xff0c;xilinx的底层目前主要有gtp gtx gth gty,不同的底层&#xff0c;PHY都需要重新适配 以下开始针对ZCU器件的GTH4底层进行配置 首先可以选择对应的类型 2&#xff0c;设置数据位宽&#xff0c;我这里设置为32位宽…

百度松果菁英班——机器学习实践五:明星图片爬取

飞桨AI Studio星河社区-人工智能学习与实训社区 &#x1f96a;图片爬取 import requests import os import urllib ​ class GetImage():def __init__(self,keyword大雁,paginator1):# self.url: 链接头self.url http://image.baidu.com/search/acjson?self.headers {User…

Win10下VirtualBox启动任何一个虚拟机马上出现蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)

环境: Win10专业版 VirtualBox5.1.28 问题描述: Win10下VirtualBox启动任何一个虚拟机马上出现蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION),之前都一直没问题 检查下面功能是否开启 已启用 Credential Guard/Device Guard。 已启用 Windows 沙箱 已启用虚拟机平台…

【学习一】液压伺服与比例控制系统介绍

【学习一】液压伺服与比例控制系统介绍 需要具备的前期知识&#xff1a;自动控制、计算机控制系统等 文章目录 【学习一】液压伺服与比例控制系统介绍一、液压伺服与比例控制系统的组成二、液压伺服与比例控制系统的分类1.按系统输入信号的变化规律分类2.按被控物理量的名称分类…

SpringBoot学习笔记二

SpringBoot学习笔记二 1.SpringBoot配置加载顺序1.1 内部配置加载顺序1.2 外部配置加载顺序 2. SpringBoot整合其他框架2.1 SpringBoot整合Test2.2 SpringBoot整合Redis 1.SpringBoot配置加载顺序 1.1 内部配置加载顺序 同理可知&#xff0c;父项目中的confg下的配置优先级最…