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语言代码
Language: GNU C Result: Accepted
Pid: 1683
Time: 0.00 sec.
Memory: 828 K. Code Length: 0.6 K.
给定两个序列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:36Language: 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; }
相关文章推荐
- hdu 1159 经典dp最长公共子序列
- hdu 1159 Common Subsequence(最长公共子序列,DP)
- nyoj36 最长公共子序列 【DP(二维)】
- 算法提高 最长公共子序列 (DP VS 递归)
- nyoj36 最长公共子序列(经典dp四)
- nyoj 36 最长公共子序列【lcs&&dp】
- DP+(POJ1458) 最长公共子序列
- hdu 1502 java大数+简单dp(最长公共子序列类似)
- hdu1159 dp(最长公共子序列)
- DP入门50题(6)——poj1458 最长公共子序列
- DP---LCS 最长公共子序列问题
- DP动态规划——hdu 1008 Common Subsequence(最长公共子序列)
- 最长公共子序列-DP
- DP之最长公共子序列 LCS
- 最长公共子序列,DP,LCS
- DP 最长公共子序列并标记输出
- uva10066 The Twin Towers(dp 最长公共子序列)
- 51Nod 1006 最长公共子序列LCS DP水题
- 最长公共子序列(dp) & hdu 1159 Common Subsequence
- UVa 531 Compromise (DP 最长公共子序列)