Coincidence (九度教程第98题) 最长公共子序列(LCS) 动态规划

2023-10-17 09:38

本文主要是介绍Coincidence (九度教程第98题) 最长公共子序列(LCS) 动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Find a longest common subsequence of two strings.
输入描述:
First and second line of each input case contain two strings of lowercase character a…z. There are no spaces before, inside or after the strings. Lengths of strings do not exceed 100.
输出描述:
For each case, output k – the length of a longest common subsequence in one line.
示例1
输入
abcd
cxbydz
输出
2

题目大意:
求出两个字符串的最长公共子串长度,典型的最长公共子序列问题。
解题思路:动态规划

与求最长递增子序列一样,我们首先将原问题分割成一些子问题,我们用
dp[ i ][ j ]表示 S1 中前 i 个字符与 S2 中前 j 个字符分别组成的两个前缀字符串的最
长公共子串长度
。显然的,当 i、j 较小时我们可以直接得出答案,如 dp[ 0 ][ j ]必
等于 0。那么,假设我们已经求得 dp[ i ][ j ](0<=i<x || 0<=j<y)的所有值,考虑如何由
这些值继而推得 dp[x][y],求得 S1 前 x 个字符组成的前缀子串和 S2 前 y 个字符
组成的前缀子串的最长公共子序列长度。
若 S1[x] = =S2[y],即 S1 中的第 x 个字符和 S2 中的第 y 个字符相同,同时由于他们都是各自前缀子串的最后一个字符,那么必存在一个最长公共子串以 S1[x]或 S2[y]结尾,其它部分等价于 S1 中前 x-1个字符和S2中前y-1个字符的最长公共子串。所以这个子串的长度比dp[x-1][y-1]又增加 1,即 dp[x][y] = dp[x-1][y-1] + 1。
相反的,若 S1[x] != S2[y],此时其最长公共子串长度为 S1 中前 x-1 个字符和 S2 中前 y 个字符的最长公共子串长度与S1 中前 x 个字符和 S2 中前 y-1 个字符的最长公共子串长度的较大者,即在两种情况下得到的最长公共子串都不会因为其中一个字符串又增加了一个字符长度发生改变。综上所述,dp[x][y] = max{dp[x-1][y],dp[x][y-1]}。

综上所述,最长公共子序列问题的递推条件:

//字符串s1长度为n, 字符串s2长度为m
//dp[i][j]表示s1中前i个字符与s2中前j个字符分别组成的两个前缀字符串的最长公共子串长度
//dp[0][j]=0    0<=j<=m
//dp[i][0]=0    0<=i<=n
//dp[n][m]中保存的值即为两个原始字符串的最长公共子序列长度
if(s1[i]==s2[j]){ dp[i][j] = dp[i-1][j-1] + 1;}
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);

AC代码

//最长公共子序列问题
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;int dp[101][101];
char s1[101], s2[101];
int main() {cin >> s1;cin >> s2;int a = strlen(s1);int b = strlen(s2);for (int i = 0; i <= a; i++) { dp[i][0] = 0; }for (int i = 0; i <= b; i++) { dp[0][i] = 0; }for (int i = 1; i <= a; i++) {for (int j = 1; j <= b; j++) {if (s1[i-1] == s2[j-1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max( dp[i][j - 1], dp[i - 1][j] );}}cout << dp[a][b] << endl;//system("pause");return 0;
}

这篇关于Coincidence (九度教程第98题) 最长公共子序列(LCS) 动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/224515

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具