标签:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 30738 | Accepted: 8817 | Special Judge |
([(]
()[()]
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 105; 6 const int inf = 0x3f3f3f3f; 7 char str[maxn]; 8 int dp[maxn][maxn]; 9 10 bool match(char a, char b){ 11 return (a==‘(‘&&b==‘)‘) || (a==‘[‘&&b==‘]‘); 12 } 13 14 int dfs(int l, int r){ 15 if (l > r) 16 return dp[l][r] = 0; 17 if (l == r) 18 return dp[l][r] = 1; 19 if (dp[l][r] != inf) 20 return dp[l][r]; 21 int ans = dp[l][r]; 22 if (match(str[l], str[r])) 23 ans = min(ans, dfs(l+1, r-1)); 24 for (int i=l; i<r; ++i) 25 ans = min(ans, dfs(l, i)+dfs(i+1, r)); 26 return dp[l][r] = ans; 27 } 28 29 void print(int l, int r){ 30 if (l > r) 31 return ; 32 if (l == r){ 33 if (str[l]==‘(‘ || str[r]==‘)‘) 34 printf("()"); 35 else 36 printf("[]"); 37 return ; 38 } 39 int ans = dp[l][r]; 40 if (match(str[l], str[r]) && ans==dp[l+1][r-1]){ 41 putchar(str[l]); 42 print(l+1, r-1); 43 putchar(str[r]); 44 return ; 45 } 46 for (int i=l; i<r; ++i) 47 if (ans == dp[l][i]+dp[i+1][r]){ 48 print(l, i); 49 print(i+1, r); 50 return ; 51 } 52 } 53 54 int main(){ 55 while (fgets(str, maxn, stdin)){ 56 int n = strlen(str); 57 str[n-1] = ‘\0‘; 58 --n; 59 memset(dp, inf, sizeof(dp)); 60 dfs(0, n-1); 61 print(0, n-1); 62 putchar(‘\n‘); 63 } 64 return 0; 65 }
标签:
原文地址:http://www.cnblogs.com/Silenceneo-xw/p/5939751.html