此题是用来求两个字符串中最长非连续子字符串长度的题目,关键在于看出动态规划方程。
稍微说一下动态规划方程的由来:
假如输入的两个字符串分别为s1和s2,长度分别是len1和len2.我构造一个二维数组f[len1][len2].其中二维数组中的元素f[i][j]的意义是:
字符串s1的子串s1[0.1.2....i]和字符串s2的子串s2[0.1.2....j]中的最长非连续子字符串长度。根据f数组的含义,可以构造出动态方程如下:
f[i][j] =  f[i-1][j-1] + 1  (s1[i] == s2[j])
f[i][j] = max{f[i][j-1],f[i-1][j]} (s1[i] != s2[j])
可见f[i][j]只是跟其左前方的三个元素有关,只要规定好求f数组的顺序,就可以利用dp的方法把f数组求出,在求f数组的过程中,只需要把f中的最大值求出来即可。
在下面的代码中,我是先求出了f的第一列和第一行,然后用dp的方法根据动态规划方程把f求解出来的。
动态规划练习二:HDU ACM 1159 Common Subsequence#include <iostream>
动态规划练习二:HDU ACM 1159 Common Subsequence#include 
<string>
动态规划练习二:HDU ACM 1159 Common Subsequence
using namespace std;
动态规划练习二:HDU ACM 1159 Common Subsequence
动态规划练习二:HDU ACM 1159 Common Subsequence
int mymax(int a,int b)
}

相关文章:

  • 2021-12-18
  • 2021-12-10
  • 2018-05-06
  • 2021-11-19
  • 2021-07-27
猜你喜欢
  • 2021-09-30
  • 2021-11-09
  • 2021-10-20
  • 2021-12-03
  • 2021-08-16
  • 2022-01-17
相关资源
相似解决方案