此题是用来求两个字符串中最长非连续子字符串长度的题目,关键在于看出动态规划方程。
稍微说一下动态规划方程的由来:
假如输入的两个字符串分别为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求解出来的。
#include <iostream>
#include <string>
using namespace std;

int mymax(int a,int b)
}
稍微说一下动态规划方程的由来:
假如输入的两个字符串分别为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求解出来的。