BUAA 求最长公共子序列的长度

 最近在研究dp类的问题,正好前几天刷北航的时候看到了这题,当时觉得没什么,最长公共子序列在大一讲dp的时候就当做经典例题讲过,但是题目中要求用尽量小的空间,后来看0-1背包的时候看到讲0-1背包的空间优化,突然就想到这题了,于是拿来练练。。。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define maxx 1002
using namespace std;

char str1[maxx] , str2[maxx] ;
int dp[2][maxx] ;

int main()
{
    int i , j , cas , len1 , len2 ;

    scanf ( "%d" , &cas );
    while ( cas-- )
    {
        scanf ( "%s" , str1 );
        scanf ( "%s" , str2 );
        len1 = strlen ( str1 );
        len2 = strlen ( str2 );
        for ( i = len1 ; i > 0 ; i-- )
        str1[i] = str1[i-1] ;
        str1[len1+1] ='\0' ;
        for ( i = len2 ; i > 0 ; i-- )
        str2[i] = str2[i-1] ;
        str2[len2+1] = '\0' ;
        dp[1][0] = 0 ;
        for ( i = 0 ; i <= len2 ; i++ )
        dp[0][i] = 0 ;
        
        //最长公共子序列中求dp[i][j]仅涉及到dp[i-1][j]和dp[i][j-1],所以只要开dp[2][maxx]就行。
        for ( i = 1 ; i <= len1 ; i++ )
        for ( j = 1 ; j <= len2 ; j++ )
        {
            dp[1][0] = 0 ;
            if ( str1[i] == str2[j] )
            dp[i%2][j] = dp[(i-1)%2][j-1] + 1;
            else if ( dp[i%2][j-1] > dp[(i-1)%2][j] )
            dp[i%2][j] = dp[i%2][j-1] ;
            else
            dp[i%2][j] = dp[(i-1)%2][j] ;
        }
        printf ( "%d\n" , dp[1][len2] > dp[0][len2] ? dp[1][len2] : dp[0][len2] );
    }
    return 0;
}

 

posted @ 2012-06-03 20:59  Misty_1  阅读(169)  评论(0编辑  收藏  举报