您的位置:首页 > 产品设计 > UI/UE

POJ 1458 Common Subsequence (DP,LCS)

2013-11-13 18:19 429 查看
基础LCS,就是求LCS,用dp来解

简单说一下LCS:

设两个字符串s1,s2,对于中间任意两个字符s1[i]跟s2[j],有两种可能

1,s1[i] == s2[j],那么s1[i]必然是s1[1.....i]跟s2[1......j]的最长公共子串的最后一位,也就是s1[1......i-1]跟s2[1.....j-1]最长公共子串长度+1,理由是如果不是,那么s1[1.....i]跟s2[1......j]的LCS长度为s1[1......i-1]跟s2[1.....j-1]的LCS长度,明显小于上面那个值

2.s1[i] !=s2[j],此时s1[1.....i]跟s2[1......j]的LCS的值必然是MAX{s1[1......i-1]跟s2[1.....j]的LCS,s1[1......i]跟s2[1.....j-1]的LCS},也就是舍弃一边不匹配情况的最大值。

基于上式就可以写状态转移方程了

if( s1[i] == s2[j]):

dp[i][j]=dp[i-1][j-1]+1

else:

dp[i][j]=MAX(dp[i][j-1],dp[i-1][j])

最后贴一下代码,个人觉得还挺简介的

#include <stdio.h>
#define MAX 240
#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
char a[MAX],b[MAX];
int dp[MAX][MAX];
int i=0,j=0;
while(scanf("%s %s",a,b)!=EOF)
{
for(i=1;0 != a[i-1];++i)
{
for(j=1;0 != b[j-1];++j)
{
dp[i][j]=a[i-1] == b[j-1]? dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d\n",dp[i-1][j-1]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: