算法刷题day18

目录

  • 引言
  • 一、最长上升子序列II
  • 二、最短编辑距离
  • 三、编辑距离

引言

本章内容实际上是对线性DP的一个扩展内容,线性DP主要是DP的一个分类,就是它的状态转移方程是线性的,就是一维一维的,其实我也没理解,人家就是这样说的,反正这种问题就是见题了,见一题做一题,理解一题,会做一种类型题,再难的一般是见不到的,所以就好好刷题就行了,还是记忆力和毅力,加油!


一、最长上升子序列II

标签:贪心

思路:这道题虽然是从DP中出来的,但其实是一道贪心题,按原来的做法已经超时了 N ( l o g N ) N(logN) N(logN) ,所以得用另一种方法来优化。核心思想:两个长度相同的子序列,肯定是结尾元素小的适用性范围更广更好,所以对于每个长度我们定义一个数组 q [ i ] q[i] q[i] ,表示长度为i的结尾元素为 q [ i ] q[i] q[i] ,这样每次遍历的时候,只需要找到最长且刚好小于 a [ i ] a[i] a[i] 的子序列,并且结尾元素最小,而这样的数组 q q q 必然是一个严格单调的数组,所以可以用二分来找。

题目描述:

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。输出格式
输出一个整数,表示最大长度。数据范围
1≤N≤100000,−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4

示例代码:

#include <cstdio>
#include <iostream>using namespace std;const int N = 1e5+10;int n;
int a[N];
int q[N];  //q[i]代表长度为i的上升子序列结尾最小的元素是q[i]int main()
{scanf("%d", &n);for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);int len = 0;q[0] = -2e9;for(int i = 1; i <= n; ++i){int l = 0, r = len;while(l < r){int mid = l + r + 1>> 1;if(q[mid] < a[i]) l = mid;else r = mid - 1;}len = max(len, r+1);q[r+1] = a[i];}printf("%d\n", len);return 0;
}

二、最短编辑距离

标签:DP

思路:这道题首先得定义好集合f[i][j]代表从A的前i个字符变化到B的前j个字符的最小操作,然后就是有三种操作: 增: f [ i ] [ j ] = f [ i ] [ j − 1 ] + 1 增:f[i][j] = f[i][j-1] + 1 增:f[i][j]=f[i][j1]+1 删: f [ i ] [ j ] = f [ i − 1 ] [ j ] + 1 删:f[i][j] = f[i-1][j] + 1 删:f[i][j]=f[i1][j]+1 改: f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + ( a [ i ] ≠ b [ j ] ) 改:f[i][j] = f[i-1][j-1] + (a[i] \neq b[j]) 改:f[i][j]=f[i1][j1]+(a[i]=b[j])然后对这三种操作取最小就行,再在开始的时候初始化 f [ 0 ] [ j ] = j , f [ i ] [ 0 ] = i f[0][j] = j, f[i][0] = i f[0][j]=j,f[i][0]=i

题目描述:

给定两个字符串 A 和 B,现在要将 A经过若干操作变为 B,可进行的操作有:
删除–将字符串 A 中的某个字符删除。
插入–在字符串 A 的某个位置插入某个字符。
替换–将字符串 A 中的某个字符替换为另一个字符。
现在请你求出,将 A 变为 B 至少需要进行多少次操作。输入格式
第一行包含整数 n,表示字符串 A 的长度。
第二行包含一个长度为 n 的字符串 A。
第三行包含整数 m,表示字符串 B 的长度。
第四行包含一个长度为 m 的字符串 B。字符串中均只包含大小写字母。输出格式
输出一个整数,表示最少操作次数。数据范围
1≤n,m≤1000
输入样例:
10
AGTCTGACGC
11
AGTAAGTAGGC
输出样例:
4

示例代码:

#include <cstdio>
#include <iostream>using namespace std;const int N = 1010;int n, m;
char a[N], b[N];
int f[N][N];int main()
{scanf("%d%s", &n, a+1);scanf("%d%s", &m, b+1);for(int i = 0; i <= m; ++i) f[0][i] = i;for(int i = 0; i <= n; ++i) f[i][0] = i;for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){f[i][j] = min(f[i][j-1], f[i-1][j]) + 1;if(a[i] == b[j]) f[i][j] = min(f[i][j], f[i-1][j-1]);else f[i][j] = min(f[i][j], f[i-1][j-1] + 1);}}printf("%d\n", f[n][m]);return 0;
}

三、编辑距离

标签:DP

思路:这道题和最短编辑距离是一样的,只是现在循环遍历了而已,最输入输出操作好基本没啥问题。

题目描述:

给定 n 个长度不超过 10 的字符串以及 m 次询问,每次询问给出一个字符串和一个操作次数上限。对于每次询问,请你求出给定的 n 个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。每个对字符串进行的单个字符的插入、删除或替换算作一次操作。输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含一个字符串,表示给定的字符串。
再接下来 m 行,每行包含一个字符串和一个整数,表示一次询问。字符串中只包含小写字母,且长度均不超过 10。输出格式
输出共 m 行,每行输出一个整数作为结果,表示一次询问中满足条件的字符串个数。数据范围
1≤n,m≤1000,输入样例:
3 2
abc
acd
bcd
ab 1
acbd 2
输出样例:
1
3

示例代码:

#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 1010;int n, m;
char str[N][N];
int f[N][N];int edit_distance(char a[], char b[])
{int la = strlen(a+1), lb = strlen(b+1);for(int i = 0; i <= lb; ++i) f[0][i] = i;for(int i = 0; i <= la; ++i) f[i][0] = i;for(int i = 1; i <= la; ++i){for(int j = 1; j <= lb; ++j){f[i][j] = min(f[i-1][j], f[i][j-1]) + 1;if(a[i] == b[j]) f[i][j] = min(f[i][j], f[i-1][j-1]);else f[i][j] = min(f[i][j], f[i-1][j-1] + 1);}}return f[la][lb];
}int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i) scanf("%s", str[i]+1);while(m--){char s[N];int limit;scanf("%s%d", s+1, &limit);int res = 0;for(int i = 1; i <= n; ++i){if(edit_distance(str[i], s) <= limit) res++;}printf("%d\n", res);}return 0;
}

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

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

相关文章

c语言之二维数组定义与初始化

二维数组可以理解和一个表格类似的东西&#xff0c;只不过没有行名称和列名称 二维数组的表达方式是 类型说明符 数组名[常量表达式] [常量表达式] 比如 int a [3] [4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}} a [3] [4] 是一个二维数组表达式&#xff0c;a是数组名&#xff0c;…

数据结构之:堆

堆&#xff08;Heap&#xff09;是计算机科学中的一种特别的完全二叉树结构&#xff0c;它满足某种特定顺序&#xff0c;用于实现优先队列等数据结构。堆主要有两种类型&#xff1a;最大堆&#xff08;Max Heap&#xff09;和最小堆&#xff08;Min Heap&#xff09;。 定义 …

云原生周刊:Docker 推出 Docker Build Cloud

开源项目推荐 Kube-Vip Kube-Vip 旨在为 Kubernetes 集群提供高可用性和负载均衡功能。它提供了一个可插拔的 VIP&#xff08;虚拟 IP&#xff09;管理器&#xff0c;可以为集群中的服务分配一个虚拟 IP 地址&#xff0c;并自动将流量路由到正确的节点。该项目提供了多种配置…

Numpy快速入门(1)

文章目录 一、Numpy是什么&#xff1f;二、基础知识1.数组创建2.数组的索引、切片和迭代3.形状操纵 一、Numpy是什么&#xff1f; NumPy是一个开源的Python库&#xff0c;提供了多维数组对象&#xff08;ndarray&#xff09;和用于处理这些数组的函数。它是科学计算和数据分析的…

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

Django 模板使用方法

1.runoob.html 文件代码如下&#xff1a; <h1>{{ hello }}</h1> 2.修改HelloWorld/settings.py&#xff0c;修改 TEMPLATES 中的 DIRS 为 [os.path.join(BASE_DIR, templates)]&#xff0c;如下所示 settings.py 文件代码&#xff1a; TEMPLATES [ { …

vue页面菜单权限问题解决

带锚点的url,#后面部分后端获取不到. vue的页面是带有#的路由,#后端服务获取不到,只在浏览器端有用. URL 中的哈希符号 (#) 被用来作为网页中的 锚点 使用&#xff0c;锚点的含义就是页面中的某个特定的位置&#xff0c;这个位置可以被快速找到&#xff0c;很类似于在该位置抛…

LeetCode 2670.找出不同元素数目差数组

给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示&#xff0c;其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, n - 1] 中不同元素的数目。 返回 nums 的 不…

请求包的大小会影响Redis每秒处理请求数量

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容压测规划客户端长连接数量对性能的影响请求包大小的影响Pipleline模式对Redis的影响 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领…

第 2 章 微信小程序的构成 (代码导读)断更,后续继续更新

2.1 小程序项目的基本结构 Hello World&#xff01;程序.mp4 文泉云盘 -- 图书二维码资源管理系统兆泰源二维码管理系统https://www.wqyunpan.com/resourceDetail.html?id284928&openIdoUgl9wdyNYHu9EcAe-GEwbQdZilY&qrcodeId242916&signc2lnbm1PUmNxSndPWGFOck…

51.仿简道云公式函数实战-文本函数-JOIN

1. JOIN函数 JOIN 函数可通过连接符将数组的值连成文本。 2. 函数用法 JOIN(数组,"连接符") 3. 函数示例 如需将复选框中勾选的选项通过”-“组合在一起&#xff0c;则可设置公式为JOIN(复选框组,"-") 4. 代码实战 首先我们在function包下创建text包…

【数据结构】【双堆】【滑动窗口】3013. 将数组分成最小总代价的子数组 II

作者推荐 动态规划的时间复杂度优化 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 数据结构 双堆 LeetCode3013. 将数组分成最小总代价的子数组 II 给你一个下标从 0 开始长度为 n 的整数数组 nums 和两个 正 整数 k 和 dist 。 一个数组的 代价 是数组中的 第一个…

JSON简介以及如何在Python中使用JSON

什么是JSON&#xff1f; JSON是"JavaScript Object Notation"的简称&#xff0c;是一种数据交换格式 JSON格式 假设我们有一个对象&#xff0c;这个对象有两个属性&#xff1a;“name”跟“age”。 在JSON中是这样表达的&#xff1a; { "name":"男孩…

vulnhub----hackme2-DHCP靶机

文章目录 一&#xff0c;信息收集1.网段探测2.端口扫描3.目录扫描 二&#xff0c;信息分析三&#xff0c;sql注入1.判断SQL注入2.查询显示位3.查询注入点4.查询库5.查询表6.查字段7. 查user表中的值8.登陆superadmin用户 四&#xff0c;漏洞利用文件上传命令执行蚁剑连接 五&am…

【深入理解设计模式】桥接设计模式

桥接设计模式 桥接设计模式是一种结构型设计模式&#xff0c;它旨在将抽象部分与实现部分分离&#xff0c;使它们可以独立变化&#xff0c;从而更好地管理复杂性。桥接模式通常涉及多个层次的抽象&#xff0c;其中一个层次&#xff08;通常称为"抽象"&#xff09;依…

防御保护----内容安全

八.内容安全--------------------------。 IAE引擎&#xff1a; IAE引擎里面的技术&#xff1a;DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对 数据包的内容进行…

【leetcode热题】三角形最小路径和

难度&#xff1a; 中等通过率&#xff1a; 37.6%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个三角形&#xff0c;找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 例如&#xff0c;给定三角形&#xff1a; [[2],[3…

goland配置新增文件头

参考&#xff1a; goland函数注释生成插件 goland函数注释生成插件_goland自动加函数说明-CSDN博客 GoLand 快速添加方法注释 GoLand 快速添加方法注释_goland批量注释-CSDN博客 goland 如何设置头注释&#xff0c;自定义author和data goland 如何设置头注释&#xff0c;自定…

Web JavaScript

目录 1 前言2 原生js常见用法2.1 弹窗操作2.2 for循环操作2.3 打印日志操作2.4 获取页面值操作2.5 判空操作2.6 修改页面内容操作2.7 网页版计算器制作 3 外部js常见用法4 总结 1 前言 JavaScript 是一种脚本&#xff0c;一门编程语言&#xff0c;它可以在网页上实现复杂的功能…

如何理解Rust中的对象

先看看下面2段代码&#xff0c;第1段代码正常&#xff0c;第2段却编译失败&#xff0c;为什么呢&#xff1f; fn main() {let a: u32 5;let b a;println!("a{a}, b{b}"); }正常 fn main() {let a String::from("Hello");let b a;println!("a{a}…