很早 很早之前就看过的一题,今天终于A了。状态转移,还算好想,输出路径有些麻烦,搞了一个标记数组的,感觉不大对,一直wa,看到别人有写直接输出的。。二了,直接输出就过了。。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 int dp[201][201]; 6 int flag[201]; 7 int pos[201]; 8 char str[201]; 9 int dfs(int L,int R) 10 { 11 int i,minz; 12 if(dp[L][R]) 13 return dp[L][R]; 14 if(L > R) 15 return dp[L][R] = 0; 16 if(L == R) 17 return dp[L][R] = 2; 18 if(str[L] == ']'||str[L] == ')') 19 return dp[L][R] = 2 + dfs(L+1,R); 20 minz = 100000; 21 for(i = L; i <= R; i ++) 22 { 23 if(str[L] == '('&&str[i] == ')') 24 minz = min(minz,2 + dfs(L+1,i-1) + dfs(i+1,R)); 25 else if(str[L] == '['&&str[i] == ']') 26 minz = min(minz,2 + dfs(L+1,i-1) + dfs(i+1,R)); 27 else 28 minz = min(minz,2 + dfs(L+1,i) + dfs(i+1,R)); 29 } 30 return dp[L][R] = minz; 31 } 32 void find(int L,int R,int ans) 33 { 34 int i; 35 if(L > R) 36 return ; 37 if(L == R) 38 { 39 if(str[L] == ')') 40 printf("()"); 41 else if(str[L] == ']') 42 printf("[]"); 43 else if(str[L] == '(') 44 printf("()"); 45 else if(str[L] == '[') 46 printf("[]"); 47 return ; 48 } 49 if(str[L] == ']'||str[L] == ')') 50 { 51 if(str[L] == ')') 52 printf("()"); 53 else if(str[L] == ']') 54 printf("[]"); 55 find(L+1,R,ans-2); 56 return ; 57 } 58 for(i = L; i <= R; i ++) 59 { 60 if(str[L] == '('&&str[i] == ')') 61 { 62 if(ans == 2 + dp[L+1][i-1] + dp[i+1][R]) 63 { 64 printf("("); 65 find(L+1,i-1,dp[L+1][i-1]); 66 printf(")"); 67 find(i+1,R,dp[i+1][R]); 68 return ; 69 } 70 } 71 else if(str[L] == '['&&str[i] == ']') 72 { 73 if(ans == 2 + dp[L+1][i-1] + dp[i+1][R]) 74 { 75 printf("["); 76 find(L+1,i-1,dp[L+1][i-1]); 77 printf("]"); 78 find(i+1,R,dp[i+1][R]); 79 return ; 80 } 81 } 82 else if(str[L] == '[') 83 { 84 if(ans == 2 + dp[L+1][i] + dp[i+1][R]) 85 { 86 printf("["); 87 find(L+1,i,dp[L+1][i]); 88 printf("]"); 89 find(i+1,R,dp[i+1][R]); 90 return ; 91 } 92 } 93 else if(str[L] == '(') 94 { 95 if(ans == 2 + dp[L+1][i] + dp[i+1][R]) 96 { 97 printf("("); 98 find(L+1,i,dp[L+1][i]); 99 printf(")"); 100 find(i+1,R,dp[i+1][R]); 101 return ; 102 } 103 } 104 } 105 return ; 106 } 107 int main() 108 { 109 int len,ans; 110 scanf("%s",str); 111 len = strlen(str); 112 ans = dfs(0,len-1); 113 find(0,len-1,ans); 114 printf(" "); 115 return 0; 116 }