poj1141Brackets Sequence(dp+路径)
dp好想 根据它定义的 记忆化下就行
路径再dfs一遍 刚开始以为要判空格 所以加了判空格的代码 后来知道不用 。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 #define INF 0xffffff 8 int dp[110][110]; 9 char s[110],q[550]; 10 int dfs(int a,int b) 11 { 12 int i,d1,d2 = INF; 13 if(dp[a][b]!=-1) 14 return dp[a][b]; 15 if(a==b) 16 return dp[a][b] = 1; 17 if(a>b) 18 return dp[a][b] = 0; 19 if(s[a]==q[s[b]]) 20 d1 = dfs(a+1,b-1); 21 else 22 { 23 int x,y; 24 x = dfs(a+1,b)+1; 25 y = dfs(a,b-1)+1; 26 d1 = min(x,y); 27 } 28 for(i = a ; i < b ; i++) 29 d2 = min(d2,dfs(a,i)+dfs(i+1,b)); 30 dp[a][b] = min(d1,d2); 31 return dp[a][b]; 32 } 33 void find(int a,int b) 34 { 35 int i; 36 if(a==b) 37 { 38 if(s[a]=='('||s[a]==')') 39 printf("()"); 40 else if(s[b]=='['||s[a]==']') 41 printf("[]"); 42 return ; 43 } 44 if(a>b) 45 return ; 46 if(s[a]==q[s[b]]&&dp[a][b]==dp[a+1][b-1]) 47 { 48 if(s[a]=='(') 49 { 50 printf("("); 51 find(a+1,b-1); 52 printf(")"); 53 } 54 else if(s[a]=='[') 55 { 56 printf("["); 57 find(a+1,b-1); 58 printf("]"); 59 } 60 } 61 else 62 if(dp[a][b]==(dp[a+1][b]+1)) 63 { 64 if(s[a]=='('||s[a]==')') 65 printf("()"); 66 else if(s[a]=='['||s[a]==']') 67 printf("[]"); 68 find(a+1,b); 69 } 70 else 71 if(dp[a][b]==dp[a][b-1]+1) 72 { 73 find(a,b-1); 74 if(s[b]=='('||s[b]==')') 75 printf("()"); 76 else if(s[b]=='['||s[b]==']') 77 printf("[]"); 78 } 79 else 80 { 81 for(i = a ; i < b ; i++) 82 { 83 if(dp[a][b]==dp[a][i]+dp[i+1][b]) 84 { 85 find(a,i); 86 find(i+1,b); 87 break; 88 } 89 } 90 } 91 } 92 int main() 93 { 94 int k; 95 q[')'] = '('; 96 q[']'] = '['; 97 //q[' '] = ' '; 98 while(gets(s)!=NULL) 99 { 100 memset(dp,-1,sizeof(dp)); 101 k = strlen(s); 102 int ans = dfs(0,k-1); 103 find(0,k-1); 104 puts(""); 105 } 106 return 0; 107 }