用动态规划策略求解最长公共子序列问题,最长公共子序列动态规划代码
DP19最长公共子序列(I)
描述两个字符串s1和s2,长度分别为n和m。求两个字符串的最长公共子序列的长度。
所谓子序列,是指从一个字符串中删除部分字符(或不删除)而形成的字符串。例如,字符串“arcaea”的子序列是“ara”、“rcaa”等等。但是“汽车”和“aaae”不是它的子序列。
s1和s2的最长公共子序列是最长字符串,它既是s1的子序列,也是s2的子序列。
数据范围:确保字符串中的字符都是小写字母。
需求:空间复杂度,时间复杂度
高级:空间复杂性,时间复杂性
描述:在第一行输入整数N和M,表示字符串s1和s2的长度。
接下来,在第二行和第三行分别输入字符串s1和s2。
输出描述:输出两个字符串的最长公共子序列的长度。
示例1输入:
5 6
新款
Bdcaaa复制
输出:
2份副本
描述:
最长的公共子序列是长度为2的“bc”或“bd”。示例2输入:
3 3
字母表
Xyz复制
输出:
0问题求解动态规划求解步骤:
定义dp[i][k]表示当字符串A和字符串B的长度分别为I和K时,初始化最长的子串长度:dp[0][k]=0,dp[i][0]=0,表示当一个字符串为0时,与另一个字符串最长匹配的子串长度为0。递归公式:若a[i-1] Dp[i][k]=dp[i-1][k-1] 1否则,Dp[i][k]等于max(dp[i][k-1],dp[i-1][k])代码如下:
#包含位/标准数据。h
int solve(const std:string a,const std:string b)
{
if (a.size()==0 b.size()==0)
{
返回0;
}
//dp[i][k]表示长度为I的A和长度为k的B之间的最长匹配数。
STD:vector STD:vector int DP(a . size()1,std:vector int (b.size() 1,0));
int len=0;
for(int I=1;I=a . size();我)
{
for(int k=1;k=b . size();k)
{
if (a[i - 1]==b[k - 1])
{
DP[I][k]=DP[I-1][k-1]1;
}
其他
{
dp[i][k]=std:max(dp[i - 1][k],DP[I][k-1]);
}
}
}
return DP[a . size()][b . size()];
}
int main()
{
int m,n;
STD:CIN m n;
STD:string a;
STD:string b;
STD:CIN a b;
std:cout solve(a,b)STD:endl;
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。