首页 > 代码库 > Laoj P1196 最长公共子序列
Laoj P1196 最长公共子序列
问题背景
|
动态规划入门-第15题
|
试题描述
|
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=《x1,x2,……,xm》,则另一序列Z=《z1,z2,……,zk》是X的子序列是指存在一个严格递增的下标序列 《i1,i2,……,ik》,使得对于所有j=1,2,……,k有:
Zj=Xij 例如,序列Z=《B,C,D,B》是序列X=《A,B,C,B,D,A,B》的子序列,相应的递增下标序列为《2,3,5,7》。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=《A,B,C,B,D,A,B》和Y=《B,D,C,A,B,A》,则序列《B,C,A》是X和Y的一个公共子序列,序列《B,C,B,A》也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。 给定两个序列X=《x1,x2,……,xm》和Y=《y1,y2,……,yn》,要求找出X和Y的一个最长公共子序列。 |
输入格式
|
共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。
|
输出格式
|
一个非负整数,表示所求得的最长公共子序列的长度,若不存在公共子序列,则仅输出一个整数0。
|
输入示例
|
ABCBDAB
BDCABA |
输出示例
|
4
|
【分析】
dp入门,就是LCS啦,用的是白书上的思路,水过去。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 string s1, s2; 5 int l1, l2, dp[205][205]; 6 7 int main() { 8 memset(dp, 0, sizeof(dp)); 9 dp[0][0]=0; 10 cin >> s1 >> s2; 11 l1=s1.length(), l2=s2.length(); 12 s1=" "+s1, s2=" "+s2; 13 for (int i=1;i<=l1;++i) 14 for (int j=1;j<=l2;++j){ 15 if (s1[i]==s2[j]) 16 dp[i][j]=dp[i-1][j-1]+1; 17 else 18 dp[i][j]=max(dp[i][j-1], dp[i-1][j]); 19 } 20 cout << dp[l1][l2] << endl; 21 }
Laoj P1196 最长公共子序列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。