当前位置:网站首页>(POJ - 1458) common subsequence (longest common subsequence)
(POJ - 1458) common subsequence (longest common subsequence)
2022-07-06 16:23:00 【AC__ dream】
Topic link :http://poj.org/problem?id=1458
The question : Give you two strings at a time , Find the length of the longest common subsequence
This is a template problem for finding the longest common subsequence , This model is classic , Let me introduce the solution of this problem
This problem is solved by dynamic programming , set up dp[i][j] Represents the first string i Characters and the first... Of the second string j The length of the longest common subsequence of characters , Now let's start to analyze the state transition
If s1[i]==s2[j] that dp[i][j]=dp[i-1][j-1]+1( The default is... In the first string i Characters and the second string Of the j Match characters )
If not satisfied s1[i]==s2[j], that dp[i][j]=max(dp[i-1][j],dp[i-1][j]), How to understand this equation , Imagine , If dp[i][j] The last bit in the longest public string of the contained result corresponds to s1[m] and s2[n], Then it must be satisfied m!=i perhaps n!=j, because s1[i]!=s2[j], Now if n!=j Well , Then there must be dp[i][j-1]=dp[i][j], Because at this time, the second string j Characters do not belong to the characters in the longest common subsequence , So there is dp[i][j-1]=dp[i][j], Similarly, you can get if m!=i, At this time there is dp[i-1][j]=dp[i][j], therefore dp[i][j]=max(dp[i-1][j],dp[i-1][j])
At this time, some students may have doubts , Why to be s1[i]==s2[j] when dp[i][j]=dp[i-1][j-1]+1, Don't dp[i-1][j-1]+1>=max(dp[i-1][j],dp[i-1][j]), In fact, this inequality is true , According to our definition of state, we can get dp[i-1][j-1]+1>=dp[i-1][j] as well as dp[i-1][j-1]+1>=dp[i][j-1], Therefore, the above inequality will hold
The implementation is relatively simple , Here is the code :
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
const int N=1003;
char a[N],b[N];
int dp[N][N];//dp[i][j] Express a Middle front of string i Characters and b Middle front of string j The number of elements in the longest common subsequence of characters
int main()
{
while(scanf("%s%s",a+1,b+1)!=EOF)
{
int lena=strlen(a+1),lenb=strlen(b+1);
for(int i=1;i<=lena;i++)
for(int j=1;j<=lenb;j++)
{
if(a[i]==b[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
printf("%d\n",dp[lena][lenb]);
}
return 0;
}
边栏推荐
- Anaconda下安装Jupyter notebook
- Is the sanic asynchronous framework really so strong? Find truth in practice
- Specify the format time, and fill in zero before the month and days
- 1529. Minimum number of suffix flips
- Share an example of running dash application in raspberry pie.
- Acwing: Game 58 of the week
- 树莓派CSI/USB摄像头使用mjpg实现网页摄像头监控
- 树莓派4B64位系统安装miniconda(折腾了几天终于解决)
- 图图的学习笔记-进程
- Data storage in memory & loading into memory to make the program run
猜你喜欢
读取和保存zarr文件
QT实现圆角窗口
Analyse du format protobuf du rideau en temps réel et du rideau historique de la station B
分享一个在树莓派运行dash应用的实例。
921. Minimum additions to make parentheses valid
1013. Divide the array into three parts equal to and
Li Kou - 298th weekly match
1689. Ten - the minimum number of binary numbers
Pyside6 signal, slot
Discussion on QWidget code setting style sheet
随机推荐
QWidget代码设置样式表探讨
(POJ - 3685) matrix (two sets and two parts)
Flask框架配置loguru日志庫
Click QT button to switch qlineedit focus (including code)
OneForAll安装使用
Bidirectional linked list - all operations
(POJ - 2739) sum of constructive prime numbers (ruler or two points)
Classic application of stack -- bracket matching problem
1005. Maximized array sum after K negations
Quick to typescript Guide
Opencv learning log 26 -- detect circular holes and mark them
Calculate the time difference
Suffix expression (greed + thinking)
本地可视化工具连接阿里云centOS服务器的redis
力扣——第298场周赛
Sanic异步框架真的这么强吗?实践中找真理
Problem - 1646C. Factorials and Powers of Two - Codeforces
Codeforces Round #799 (Div. 4)A~H
Maximum product (greedy)
useEffect,函數組件掛載和卸載時觸發