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

TOJ 1683 Common Subsequence 最长公共子序列 依然DP

2009-10-07 21:21 701 查看
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切的说,若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。

给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。

例如,若X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A}则序列{B,C,A}是X和Y的一个公共子序列,但它不是X和Y的一个最长公共子序列。序列{B,C,B,A}也是X和Y的一个公共子序列,它的长度为4,而且它是X和Y的最长公共子序列,因为X和Y没有长度大于4的公共子序列。

最长公共子序列问题:给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

------王晓东《计算机算法分析与设计》

原题地址

C语言代码

Show Code - Run ID 764179

Submit Time: 2009-10-07 16:05:36
Language: GNU C Result: Accepted

Pid: 1683
Time: 0.00 sec.
Memory: 828 K. Code Length: 0.6 K.

#include<stdio.h>
#include<string.h>
#define M 201
char a[M],b[M];
int c[M][M];//c[i][j]代表第一个字符串前i个字符组成的字符串与第二个字符串前j个字符组成的字符串的最长公共子串的长度.
int dp(){
int i,j,la,lb;
la=strlen(a);
lb=strlen(b);
for(i=0;i<=la;i++) c[i][0]=0;//初始化
for(i=0;i<=lb;i++) c[0][i]=0;//初始化
for(i=la+1;i>=1;i--) a[i]=a[i-1];//因为0用来代表没有字符,所以把字符全部向后挪一位
for(i=lb+1;i>=1;i--) b[i]=b[i-1];//同上
for(i=1;i<=la;i++)
for(j=1;j<=lb;j++)
{
if(a[i]==b[j]) c[i][j]=c[i-1][j-1]+1;
else c[i][j]=c[i-1][j]>c[i][j-1]?c[i-1][j]:c[i][j-1];//状态转移方程
}
return c[la][lb];
}
int main()
{
while(scanf("%s%s",a,b)!=EOF) printf("%d/n",dp());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: