1 // accepted 208 K 0 ms 2 // DP 3 // longest public subsequence + Path 4 # include <cstdio> 5 # include <cstring> 6 # include <iostream> 7 using namespace STD; 8 const int imax_n = 105; 9 const int INF = 100000000; 10 int DP [imax_n] [imax_n]; 11 char S1 [imax_n], S2 [imax_n]; 12 INT L1, l2; 13 int max (int A, int B) 14 {15 return A> B? A: B; 16} 17 void dp () 18 {19 memset (DP, 0, sizeof (DP); 20 21 for (INT I = 1; I <= L1; I ++) 22 {23 for (Int J = 1; j <= L2; j ++) 24 {25 // DP [I] [J] = inf; 26 dp [I] [J] = max (DP [I-1] [J], DP [I] [J-1]); 27 if (S1 [I-1] = S2 [J-1]) 28 DP [I] [J] = max (DP [I] [J], DP [I-1] [J-1] + 1); 29} 30} 31 // printf ("% d \ n", DP [L1] [L2]); 32} 33 void output (int I, Int J) 34 {35 if (DP [I] [J] = 0) 36 {37 for (int K = 1; k <= I; k ++) 38 printf ("% C", S1 [k-1]); 39 for (int K = 1; k <= J; k ++) 40 printf ("% C", S2 [k-1]); 41 return; 42} 43 If (DP [I] [J] = DP [I-1] [J-1] + 1 & S1 [I-1] = S2 [J-1]) 44 {45 output (I-1, J-1); 46 printf ("% C", S1 [I-1]); 47 return; 48} 49 If (DP [I] [J] = DP [I-1] [J]) 50 {51 output (I-1, J); 52 printf ("% C ", s1 [I-1]); 53 return; 54} 55 if (DP [I] [J] = DP [I] [J-1]) 56 {57 output (I, j-1); 58 printf ("% C", S2 [J-1]); 59 return; 60} 61} 62 int main () 63 {64 While (scanf ("% S % s", S1, S2 )! = EOF) 65 {66 L1 = strlen (S1); 67 L2 = strlen (S2); 68 dp (); 69 output (L1, L2 ); 70 printf ("\ n"); 71} 72 return 0; 73}View code
Poj2264 DP + path