时间限制:1000MS 代码长度限制:10KB
题型: 编程题 语言: G++;GCC;VC
Description
给定两个字符串,请输出这两个字符串的最大公共子序列
输入格式
两行,一行一个字符串(不包括空格,Tab键),长度不超过1000
输出格式
输出最大公共子序列的长度
输入样例
abbca
aba
输出样例
3
一道经典的二维动态规划题目。
dp[i][j]表示第1~i个字符的a串与第1~j个字符的b串的最长公共子序列长度。
以输入样例为例子,dp数组为
如果a[i]==b[j],回溯到未出现这两个相等的字符前的状态再加上这个字符。
如果a[i]!=b[j],那么就在分别未加入这两个不同的字符的情况下选择长度较大的继承。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1001][1001];
int main(){
string a,b;
cin>>a>>b;
int lb=b.length(),la=a.length();
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){
if(a[i]==b[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]);
}
}
}
cout<<dp[la][lb];
return 0;
}