poj 1141 Brackets Sequence(区间dp)
2015-02-22 08:21
411 查看
Language: Default Brackets Sequence
Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a regular sequence, then (S) and [S] are both regular sequences. 3. If A and B are regular sequences, then AB is a regular sequence. For example, all of the following sequences of characters are regular brackets sequences: (), [], (()), ([]), ()[], ()[()] And all of the following character sequences are not: (, [, ), )(, ([)], ([(] Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n. Input The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them. Output Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence. Sample Input ([(] Sample Output ()[()] Source Northeastern Europe 2001 |
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 305 #define INF 0x3f3f3f3f int dp ,vis ; char a ; inline bool judge(int i,int j) { if(a[i]=='('&&a[j]==')'||a[i]=='['&&a[j]==']') return true; return false; } void print(int i,int j) { if(i>j) return ; if(i==j) { if(a[i]=='('||a[i]==')') printf("()"); else printf("[]"); return ; } if(vis[i][j]==-1) { printf("%c",a[i]); print(i+1,j-1); printf("%c",a[j]); return ; } print(i,vis[i][j]); print(vis[i][j]+1,j); } int main() { int i,j; while(gets(a)) { int len=strlen(a); if(len==0) { printf("\n"); continue; } memset(dp,0,sizeof(dp)); memset(vis,-1,sizeof(vis)); for(i=0;i<len;i++) dp[i][i]=1; for(i=len-1;i>=0;i--) for(j=i+1;j<len;j++) { dp[i][j]=dp[i+1][j]+1; //刚开始是自己匹配,即加一个 vis[i][j]=i; if(judge(i,j)) //如果首尾匹配,这个特殊处理 { if(dp[i][j]>dp[i+1][j-1]) { dp[i][j]=dp[i+1][j-1]; vis[i][j]=-1; } } for(int k=i+1;k<j;k++) //i~j,之间有匹配的 if(judge(i,k)) { if(dp[i][j]>dp[i][k]+dp[k+1][j]) { dp[i][j]=dp[i][k]+dp[k+1][j]; vis[i][j]=k; } } } print(0,len-1); printf("\n"); } return 0; }
相关文章推荐
- DP Brackets Sequence POJ 1141
- poj 1141 Brackets Sequence dp
- 【POJ 2955】【经典区间DP 递推写法】 Brackets 【合法括号匹配成功结果+2,求最大结果】
- POJ 2955 Brackets 区间DP
- POJ 1141 Brackets Sequence (区间dp 记录路径)
- poj 2955 Brackets(区间DP)
- POJ 2955 Brackets(区间DP, 记忆化搜索)
- POJ 2955 括号匹配 Brackets (区间DP)
- POJ - 2955Brackets(区间DP)
- poj 2955 Brackets(区间DP)
- poj 1141 Brackets Sequence(区间dp)
- POJ 2955 Brackets [区间dp]
- POJ 2955 Brackets (区间DP)
- poj 1141 Brackets Sequence 区间dp入门
- Brackets sequence UVA - 1626 (典型的区间dp+递归打印路径)
- Brackets(poj-2955)(区间dp)
- poj 1141 Brackets Sequence(区间DP+路径打印)
- poj 2955 Brackets (区间DP)
- POJ 2955 Brackets 【区间dp】【水题】
- POJ 2955 Brackets(区间DP)