标签:
Description
Input
Output
Sample Input
input | output |
---|---|
([(] |
()[()] |
大意:匹配最少的括号并输出
定义dp[i][j] 表示从i到j最少所需要匹配的括号 ,定义pos[i][j] 表示从i到j是否能括号匹配
状态转移方程 dp[x][y] = min(dp[x][y],dp[x][i]+dp[i+1][y])
杰哥代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[110][110]; int pos[110][110]; char s[110]; const int inf = 0x3f3f3f3f; void dfs(int x,int y) { if(dp[x][y] != -1) return ; if(x > y) { dp[x][y] = 0; return ; } if(x == y){ dp[x][y] = 1; return ; } dp[x][y] = inf; if((s[x] == ‘(‘ && s[y] == ‘)‘)||(s[x] == ‘[‘ && s[y] == ‘]‘)){ pos[x][y] = -1; dfs(x+1,y-1); dp[x][y] = dp[x+1][y-1]; } for(int i = x; i < y; i++){ dfs(x,i); dfs(i+1,y); if(dp[x][i] + dp[i+1][y] < dp[x][y]){ dp[x][y] = dp[x][i] + dp[i+1][y]; pos[x][y] = i; } } } void print(int x,int y) { if(x > y) return ; if(x == y){ if(s[x] == ‘(‘ || s[x] == ‘)‘) printf("()"); else printf("[]"); return ; } if(pos[x][y] == -1){ printf("%c",s[x]); print(x+1,y-1); printf("%c",s[y]); } else { print(x,pos[x][y]); print(pos[x][y]+1,y); } } int main() { scanf("%s",s+1); int n = strlen(s+1); memset(dp,-1,sizeof(dp)); dfs(1,n); print(1,n); printf("\n"); return 0; }
URAL1183——DFS+回溯—— Brackets Sequence
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4498724.html