皎月半洒花
2019-01-04 19:55:22
嗝……又水一道DP……
其实发这篇题解主要是讲
首先
换句话说,这道题空间完全可以只开
我们思考,本题比较理想的输出路径是
inline void Print(int x, int y, int z){
if (!x || !y || !z) return ;
if (dp[x][y][z] == dp[x - 1][y][z]) Print(x - 1, y, z) ;
else if (dp[x][y][z] == dp[x][y - 1][z]) Print(x, y - 1, z) ;
else if (dp[x][y][z] == dp[x][y][z - 1]) Print(x, y, z - 1) ;
else if (dp[x][y][z] == dp[x - 1][y - 1][z - 1] + 1) Print(x - 1, y - 1, z - 1), putchar(A[x]) ;
}
然后
怎么说呢。。。其实渐进意义下,空间复杂度还是不变的
#include <cstdio>
#include <cstring>
#include <iostream>
#define Bx 101
#define max mmax
#define sr strlen
using namespace std ;
char A[Bx], B[Bx], C[Bx] ;
int dp[Bx][Bx][Bx], LA, LB, LC ;
inline void Print(int x, int y, int z){
if (!x || !y || !z) return ;
if (dp[x][y][z] == dp[x - 1][y][z]) Print(x - 1, y, z) ;
else if (dp[x][y][z] == dp[x][y - 1][z]) Print(x, y - 1, z) ;
else if (dp[x][y][z] == dp[x][y][z - 1]) Print(x, y, z - 1) ;
else if (dp[x][y][z] == dp[x - 1][y - 1][z - 1] + 1) Print(x - 1, y - 1, z - 1), putchar(A[x]) ;
}
inline int mmax(int a, int b){ return a > b ? a : b ;}
int main(){
register int i, j, k ;
cin >> A+1 >> B+1 >> C+1 ;
LA = sr(A + 1), LB = sr(B + 1), LC = sr(C + 1) ;
for (i = 1 ; i <= LA ; ++ i)
for (j = 1 ; j <= LB ; ++ j)
for (k = 1 ; k <= LC ; ++ k)
if (A[i] == B[j] && B[j] == C[k])
dp[i][j][k] = dp[i - 1][j - 1][k - 1] + 1 ;
else dp[i][j][k] = max(dp[i - 1][j][k], max(dp[i][j - 1][k], dp[i][j][k - 1])) ;
Print(LA, LB, LC) ; return 0 ;
}