ZOJ 1463 Brackets Sequence
区间DP,刘汝佳黑书p113例题
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int MAXN = 210; 9 const int INF = 1 << 30; 10 11 char str[MAXN]; 12 int dp[MAXN][MAXN]; 13 int path[MAXN][MAXN]; 14 bool vis[MAXN][MAXN]; 15 int len; 16 17 inline bool check( char a, char b ) 18 { 19 return (a == '(' && b == ')') || ( a == '[' && b == ']' ); 20 } 21 22 void PrintPath( int i, int j ) 23 { 24 if ( i > j ) return; 25 if ( i == j ) 26 { 27 if ( str[i] == '[' || str[i] == ']' ) 28 printf( "[]" ); 29 else printf( "()" ); 30 return; 31 } 32 if ( path[i][j] == -1 ) 33 { 34 putchar( str[i] ); 35 PrintPath( i + 1, j - 1 ); 36 putchar( str[j] ); 37 } 38 else 39 { 40 PrintPath( i, path[i][j] ); 41 PrintPath( path[i][j] + 1, j ); 42 } 43 } 44 45 void DP() 46 { 47 for ( int i = 1; i <= len; ++i ) dp[i][i - 1] = 0; 48 for ( int i = 1; i <= len; ++i ) dp[i][i] = 1; 49 50 for ( int p = 1; p < len; ++p ) 51 for ( int i = 1; i <= len - p; ++i ) 52 { 53 int j = i + p; 54 dp[i][j] = INF; 55 if ( check( str[i], str[j] ) ) 56 { 57 if ( dp[i + 1][j - 1] < dp[i][j] ) 58 { 59 dp[i][j] = dp[i + 1][j - 1]; 60 path[i][j] = -1; 61 } 62 } 63 64 for ( int k = i; k < j; ++k ) 65 { 66 if ( dp[i][k] + dp[k + 1][j] < dp[i][j] ) 67 { 68 dp[i][j] = dp[i][k] + dp[k + 1][j]; 69 path[i][j] = k; 70 } 71 } 72 } 73 return; 74 } 75 76 int main() 77 { 78 int T; 79 bool flag = false; 80 scanf( "%d", &T ); 81 getchar(); 82 while ( T-- ) 83 { 84 getchar(); 85 gets( &str[1] ); 86 len = strlen( &str[1] ); 87 DP(); 88 if ( flag ) putchar('\n'); 89 PrintPath( 1, len ); 90 putchar('\n'); 91 flag = true; 92 } 93 return 0; 94 }