NYOJ-36-最长公共子序列

    xiaoxiao2021-04-16  32

    时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。 tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000. 输出 每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。 样例输入 2 asdf adfsd 123abc abc123abc 样例输出 3 6

    #include <stdio.h>#include <string.h>#include <algorithm>int dp[1005][1005];int main(){ using namespace std; int n; char str1[1005],str2[1005]; int len_1,len_2; scanf("%d",&n); while(n--) { memset(dp,0,sizeof(dp)); scanf("%s%s",str1,str2); len_1 = strlen(str1); len_2 = strlen(str2); for(int i=1;i <= len_1; i++) { for(int j=1; j <= len_2; j++) { if(str1[i-1] == str2[j-1]) { dp[i][j] = dp[i-1][j-1]+1; } else { dp[i][j] = max(dp[i][j-1] , dp[i-1][j]); } } } printf("%d\n",dp[len_1][len_2]); } return 0;}

    思路:当str_1[i] == str_2[j]时 ,dp[i][j] = dp[i-1][j-1] + 1; 因为既然它们相等了,所以只要之前的LCS+1就行了。 当str_1[i] != str_2[j]时,要取str_1[i]和str_2[j-1]   与   str_1[i-1]和str_[j] 的最大LCS。
    转载请注明原文地址: https://ju.6miu.com/read-672742.html

    最新回复(0)