18308 最长公共子序列
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
给定两个字符串,请输出这两个字符串的最大公共子序列
输入格式
两行,一行一个字符串(不包括空格,Tab键),长度不超过1000
输出格式
输出最大公共子序列的长度
输入样例
abbca
aba
总结
1.这里用了一个二位数组去记录,比如LCS[4][5]就是代表着,a字符串中1-4个字符和b字符串1-5个字符中的最长公共子序列。
这是一道很经典的动态规划问题。
2.需要注意的是,这里当判断相同的时候,则是对左上角的那个LCS数加1,因为可以理解为,这两个字符相同,然后最长公共子序列就是去掉这两个相同字符的情况下+1。
如果不相同的话,就是对分别看两个字串(左边和上面的位置),哪个公共子序列大就取谁。
3。记得初始化,意义就是该串对于空串的最大公共子序列是0.
#include <iostream>
#include "cstring"
using namespace std;
int main() {
char a[1005],b[1005];
cin>>a>>b;
int aLen,bLen;
aLen= strlen(a);bLen=strlen(b);
int LCS[aLen+1][bLen+1];//+1是因为为了存放空集
for(int i=0;i<aLen;i++)//初始化,第一行都是0
LCS[0][i]=0;
for(int i=0;i<bLen;i++)//初始化,第一列都是0
LCS[i][0]=0;
for(int i=1;i<bLen+1;i++)
for(int j=1;j<aLen+1;j++)
{
if(a[j]==b[i])
LCS[i][j]=LCS[i-1][j-1]+1;
else
LCS[i][j]=max(LCS[i-1][j],LCS[i][j-1]);
}
cout<<LCS[bLen][aLen]<<endl;
return 0;
}
https://blog.csdn.net/weixin_40673608/article/details/84262695
具体程序运算过程参考这个网站