最近在研究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; }