I - Common Subsequence
Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
Description
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, x
ij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
Input
The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.
Output
For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
Hint
OUTPUT DETAILS:
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
a | b | f | c | a | b | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | |
b | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
a | 0 | 1 | 1 | 1 | 1 | 2 | 2 |
f | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
c | 0 | 1 | 1 | 2 | 3 | 3 | 3 |
a | 0 | 1 | 1 | 2 | 3 | 4 | 4 |
b | 0 | 1 | 2 | 2 | 3 | 4 | 5 |
f[i][j]表示a的前i个元素和b的前j个元素之间的最长公共子序列的长度
初始条件是f[0][*]和f[*][0]做全为0 实际上是冗余 因为这些数值没有与元素有实际的对应关系 而是而是假设其中一个输入为null时的情况(边界条件)
参考代码:
// HDOJ_1159.cpp : Common Subsequence
// 16ms AC
#include <iostream>
using namespace std;
char a[1002];
char b[1002];
int f[1002][1002];
int main()
{
int i, j;
int alen, blen;
while ( scanf("%s %s",a+1,b+1)!=EOF ){
alen = strlen(a+1);
blen = strlen(b+1); //原来可以用a+1 的
for( i=0; i<=alen; i++ )
for ( j=0; j<alen; j++ )
f[i][j] = 0; //初始化f数组
for( i=1; i<=alen; i++ )
for( j=1; j<=blen; j++ ){
if( a[i]==b[j] )
f[i][j] = f[i-1][j-1]+1;
else
f[i][j] = f[i-1][j]>f[i][j-1]?f[i-1][j]:f[i][j-1]; //重要判别部分,由表格发现的规律可轻松得出
}
cout << f[alen][blen] << endl;
/*for( i=1; i<=alen; i++ ){
for( j=1; j<=blen; j++ )
cout << f[i][j] << " ";
cout << endl;
}*/
//输出 f 数组
}
return 0;
}