当前位置:   article > 正文

1297:公共子序列_1297:公共子序列

1297:公共子序列

【解题思路】
1. 状态定义
状态定义:dp[i][j]表示X序列的前i个元素与Y序列的前j个元素的最长公共子序列的长度。
初始状态:
X序列前i个元素与Y序列前0个元素的最长公共子序列的长度为0:dp[i][0]=0
X序列前0个元素与Y序列前j个元素的最长公共子序列的长度为0:dp[0][j]=0

2. 状态转移方程
记X i表示X序列的前i个元素构成的子序列。Y j 表示Y序列的前j个元素构成的子序列。x[i]为X序列的第i个元素,y[j]为Y序列的第j个元素
分割集合:X i 与Y j 两序列的公共子序列

如果x[i]等于y[j],那么x[i](或y[j])一定是X i 与Y j  的最长公共子序列的最后一个元素。该最长公共子序列是由X i − 1 与Y j − 1 两序列的最长公共子序列后面添加x[i]得到的,长度为:dp[i][j] = dp[i-1][j-1]+1
如果x[i]不等于y[j]
如果x[i]不作为 X i 与Y j 的最长公共子序列的最后一个元素,那么X i 与Y j 的最长公共子序列就是X i − 1 与Y j 的最长公共子序列,长度为dp[i][j] = dp[i-1][j]
如果y[j]不作为 X i与Y j 的最长公共子序列的最后一个元素,那么X i与Y j 的最长公共子序列就是X i 与Y j − 1 的最长公共子序列,长度为dp[i][j] = dp[i][j-1]
以上两种情况取最大值。
注意多组数据处理

【题解代码】
 

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 205
  4. int dp[N][N];
  5. int main()
  6. {
  7. string x, y;
  8. while(cin >> x >> y)
  9. {
  10. int lx = x.length(), ly = y.length();
  11. for(int i = 1; i <= lx; ++i)
  12. for(int j = 1; j <= ly; ++j)
  13. {
  14. if(x[i-1] == y[j-1])//i,j下标从1开始 转为 x,y下标从0开始
  15. dp[i][j] = dp[i-1][j-1] + 1;
  16. else
  17. dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
  18. }
  19. cout << dp[lx][ly] << endl;
  20. }
  21. return 0;
  22. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/169441
推荐阅读
相关标签
  

闽ICP备14008679号