【动态规划】最长公共子序列
Time Limit:1000MS Memory Limit:65536K
Description
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,……,k有:
例如,序列Z=是序列X=的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=和Y=,则序列是X和Y的一个公共子序列,序列也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。
给定两个序列X=和Y=,要求找出X和Y的一个最长公共子序列。
Input
输入共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。
Output
输出第一行为一个非负整数,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出文件仅有一行输出一个整数0。
Sample Input
ABCBDAB BDCABA
Sample Output
4
简单题+AC
#include <cstdio> #include <string> #include <algorithm> using namespace std; char s[1000],t[1000]; int dp[200][200]; int main() { int l1,l2; gets(s);gets(t); l1=strlen(s);l2=strlen(t); for(int i=0;i<l1;i++) for(int j=0;j<l2;j++) if(s[i]==t[j])dp[i+1][j+1]=dp[i][j]+1; else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); printf("%d",dp[l1][l2]); return 0; }
【动态规划】最长公共子序列(续)
Time Limit:1000MS Memory Limit:65536K
Description
字符序列的连续子序列是指从给定字符序列中取出若干连续的字符(必须连续)所形成的字符序列。
对给定的两个字符序列,求出他们最长的公共连续子序列。
参考1430
Input
输入共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。
Output
输出最长的公共连续子序列长度
Sample Input
ABCBDAB BDCABA
Sample Output
2
简单题+AC
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[1000+1],t[1000+1]; int ans,lens,lent,dp[1000+1][1000+1]; int main() { scanf("%s%s",s,t); lens=strlen(s);lent=strlen(t); for(int i=0;i<lens;i++) for(int j=0;j<lent;j++) { if(s[i]==t[j])dp[i+1][j+1]=dp[i][j]+1; ans=max(ans,dp[i+1][j+1]); } printf("%d",ans); return 0; }