当前位置:网站首页>(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;
}边栏推荐
- input 只能输入数字,限定输入
- Flag framework configures loguru logstore
- Read and save zarr files
- Input can only input numbers, limited input
- 图图的学习笔记-进程
- 指定格式时间,月份天数前补零
- (POJ - 2739) sum of constructive prime numbers (ruler or two points)
- The "sneaky" new asteroid will pass the earth safely this week: how to watch it
- 生成随机密码/验证码
- Socket communication
猜你喜欢

300th weekly match - leetcode

409. Longest palindrome

1013. Divide the array into three parts equal to and

1529. Minimum number of suffix flips

1855. Maximum distance of subscript alignment

Openwrt build Hello ipk

Problem - 922D、Robot Vacuum Cleaner - Codeforces

Suffix expression (greed + thinking)

Analysis of protobuf format of real-time barrage and historical barrage at station B

1323. Maximum number of 6 and 9
随机推荐
Opencv learning log 28 -- detect the red cup cover
QT implementation fillet window
Useeffect, triggered when function components are mounted and unloaded
antd upload beforeUpload中禁止触发onchange
C language learning notes
“鬼鬼祟祟的”新小行星将在本周安全掠过地球:如何观看
Codeforces Round #802(Div. 2)A~D
Install Jupiter notebook under Anaconda
AcWing:第58场周赛
E. Breaking the Wall
Suffix expression (greed + thinking)
计算时间差
Codeforces - 1526C1&&C2 - Potions
OneForAll安装使用
F - birthday cake (Shandong race)
Li Kou: the 81st biweekly match
875. Leetcode, a banana lover
Codeforces Round #801 (Div. 2)A~C
拉取分支失败,fatal: ‘origin/xxx‘ is not a commit and a branch ‘xxx‘ cannot be created from it
Write web games in C language