动态规划3:最长公共子序列(不连续)

野性酷女 2023-07-09 02:11 110阅读 0赞
  1. //最长公共子序列--LCS
  2. #include <stdio.h>
  3. #include "cstring"
  4. #include "vector"
  5. #include "algorithm"
  6. using namespace std;
  7. const int N = 100;
  8. char A[N], B[N];
  9. int dp[N][N];//dp[i][j] A的i号位置与B的j号位置之前的LCS长度
  10. int main() {
  11. fgets(A + 1, N, stdin);//从1号位置开始
  12. fgets(B + 1, N, stdin);
  13. int lengthA = strlen(A + 1) - 1;
  14. int lengthB = strlen(B + 1) - 1;
  15. //边界
  16. for (int i = 0; i <= lengthA; i++) {
  17. dp[i][0] = 0;
  18. }
  19. for (int j = 0; j <= lengthB; j++) {
  20. dp[0][j] = 0;
  21. }
  22. //状态转移方程
  23. for (int i = 1; i <= lengthA; i++) {
  24. for (int j = 1; j <= lengthB; j++) {
  25. if (A[i] == B[j]) {
  26. dp[i][j] = dp[i - 1][j - 1] + 1;
  27. } else {
  28. dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
  29. }
  30. }
  31. }
  32. printf("%d\n", dp[lengthA][lengthB]);
  33. return 0;
  34. }
  35. /* sadstory adminsorry */

测试结果:
在这里插入图片描述

发表评论

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

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

相关阅读