今天看到了一个讲LCS非常详细的视频,附上链接
十分钟搞定LCS。
和视频里的思路一样。
。
从末尾向前找。一共两种情况:s[i]==s[j]以及s[i]!=s[j]
讨论如下
if (s1[i] == s2[j])//如图中的(3,3)点。
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else//如图中(4,5)点
{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
附上一道题,Common Subsequence
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int dp[1000][1000];
char s1[1000];
char s2[1000];
int main()
{
while(scanf("%s %s",s1+1,s2+1)!=EOF)
{
memset(dp,0,sizeof(dp));
s1[0] = s2[0] = '0';
int len1 = strlen(s1) - 1;
int len2 = strlen(s2) - 1;
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if (s1[i] == s2[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;
}