求最长公共子序列,以前那篇用DP的说实在的没真正搞懂,现在学了DP稍微好一点,但感觉思维还是不通透的感觉
顺便贴一下LCS的图解算法
s1:2 5 7 9 3 1 2
s2:3 5 3 2 8
1. 阵列开头均设为空
2. S1[i]=S2[j]相同,dp[i][j]则继承左上方向dp[i-1][j-1]的值+1
3. 不相同dp[i][j]则继承上方与左方中的最大数值,其实是将问题转换为这样两个子问题,S1少一个和S2少一个对应的dp哪一个数值大,这样逆着想回去。
最后整个二维阵列列中最大的值,就是s1和s2的最长公共子串长度
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
char a[1000], b[1000];
int dp[1000][1000];
int i, j;
while (scanf("%s %s", a+1, b+1) != EOF)//使用+1使数组从1开始
{
memset(dp, 0, sizeof(dp));
int len1 = strlen(a+1);
int len2 = strlen(b+1);
for (i = 1; i <= len1; i++)
for (j = 1; j <= len2; j++)
{
if (a[i] == b[j])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
printf("%d\n", dp[len1][len2]);
}
return 0;
}