动态规划---最大公共子序列(连续)

矫情吗;* 2023-06-25 02:23 140阅读 0赞

比如:“abcdkkk” 和 “baabcdadabc”,可以找到的最长的公共子序列(连续)是”abcd”,所以最大公共子序列长度(连续)为 4

代码:

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define _for(a,b,c) for(int a=b;a<c;a++)
  5. #define N 256
  6. using namespace std;
  7. int f(const char* s1, const char* s2)
  8. {
  9. int a[N][N];
  10. int len1 = strlen(s1);
  11. int len2 = strlen(s2);
  12. memset(a,0,sizeof(int)*N*N);
  13. int _max = 0;
  14. _for(i,0,len1)
  15. _for(j,0,len2)
  16. if(s1[i]==s2[j])
  17. {
  18. a[i+1][j+1] = a[i][j] + 1;
  19. _max = max(_max,a[i+1][j+1]);
  20. }
  21. return _max;
  22. }
  23. int main()
  24. {
  25. cout<<f("abcdkkk","baabcdadabc");
  26. return 0;
  27. }

代码的原理:
两层 for 循环分别表示 len1 和 len2,第一次循环 len2 全部字母对应 len1第一个字母,第二次循环 len2 全部字母对应 len1 第二个字母,直到对应完 len1 全部字母,每对应一个字母 a[i][j] + 1,最后取最大的 a[i][j]

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读