• 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;
    }
  • 相关阅读:
    [erlang 002]gen_server中何时会跑到terminate函数
    设计模式:桥接模式
    设计模式:组合模式
    Harbor:镜像上传和下载
    Harbor:简介和安装
    Docker:compose
    ThinkPHP的静态化页面方法
    php使用memcached详解
    大话PHP设计模式
    PHP魔术方法使用
  • 原文地址:https://www.cnblogs.com/misty1/p/2533080.html
Copyright © 2020-2023  润新知