标签:
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
x的一个子序列相应于下标序列{1,2,3.....m}的一个子序列,故X共有2^m个子序列,直接爆,需要指数时间。为此,考虑能否用动态规划方法求解。
先找出它是否满足最优子结构性质:
设序列X={x1,...xm}和y={y2,....yn},子序列为z={z1,...zk}
(1)如果 xm=yn,则zk=xn=yn;且z(k-1)是x(m-1)和y(n-1)的最长公共子序列。
找出x(m-1)和y(n-1)的最长公共子序列,然后在其尾部加上xm(=yn)即可得x和y的一个最长公共 子序列
(2)如果xm!=yn,且zk!=xm 则z 是x(m-1)和y的最长公共子序列。
如果xm!=yn,且zk!=yn 则z 是x 和y(n-1的最长公共子序列。
找出x(m-1)和y的一个最长公共子序列及x和y(n-1)的最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
如 1 2 3 4 7
1 2 4 5
或 1 2 3 4 9
1 2 3 4
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { char a[1001],b[1001]; int n,m,i,j,c[1001][1001]; while(scanf("%s%s",&a,&b)!=EOF) { n=strlen(a); m=strlen(b); if(n==0||b==0) { printf("0\n"); break; } memset(c,0,sizeof(c)); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { if(a[i-1]==b[j-1]) { c[i][j]=c[i-1][j-1]+1; } else { c[i][j]=max(c[i-1][j],c[i][j-1]); } } } printf("%d\n",c[n][m]); } return 0; }
HDU-1159 Common Subsequence(动态规划2)
标签:
原文地址:http://www.cnblogs.com/tianmin123/p/4647744.html