[DP-LCS] POJ 1458

来源:互联网 发布:长江大数据交易所 编辑:程序博客网 时间:2024/06/05 19:36

题意

LCS

思路

LCS

代码

#include <cstdio>#include <cstring>#include <iostream>#define N 505using namespace std;int len1, len2;char s1[ N ], s2[ N ];int dp[ N ][ N ];inline int max ( int a, int b ) { return a > b ? a : b; }void LCS () {    for ( int i = 1; i <= len1; i++ ) {        for ( int j = 1; j <= len2; j++ ) {            if ( s1[ i ] == s2[ j ] )                dp[ i ][ j ] = dp[ i - 1 ][ j - 1 ] + 1;            else                dp[ i ][ j ] = max ( dp[ i - 1 ][ j ], dp[ i ][ j - 1 ] );        }    }}void Print ( int i, int j ) {    //当最长的子序列搜索完,但其中一串仍有剩余时,输出    if ( i == 0 || j == 0 ) {        return;    }    //找到公共字符    if ( s1[ i ] == s2[ j ] ) {        Print ( i - 1, j - 1 );        printf ( "%c", s1[ i ] );    } else if ( dp[ i - 1 ][ j ] > dp[ i ][ j - 1 ] ) {        Print ( i - 1, j );    } else {        Print ( i, j - 1 );    }}int main () {    while ( ~scanf ( "%s%s", s1 + 1, s2 + 1 ) ) {        len1 = strlen ( s1 + 1 );        len2 = strlen ( s2 + 1 );        memset ( dp, 0, sizeof ( dp ) );        LCS ();        printf ( "%d\n", dp[ len1 ][ len2 ] );    }    return 0;}
原创粉丝点击