Brackets Sequence
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 35049 | Accepted: 10139 | Special Judge |
Description
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
()[()] 题意:用最少的括号,补全答案。 看完题目第一想法可能是,不停地往读入的字符串中插入括号,但这样很难判断哪些是已有的匹配括号。 所以我们可以用一个二维数组pos记录片段,用dp记录区域间最少的的需要补全的括号。 初始化dp[i][i]为1,然后更新dp时顺便更新pos。然后按pos更新。 注:这题目不知道什么鬼,最后需要输出一个 ‘\n‘,否则wa。
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; const int N=256; char s[N]; int dp[N][N],pos[N][N]; bool march(char a,char b) { if(a==‘(‘&&b==‘)‘||a==‘[‘&&b==‘]‘) return true; else return false; } void print(int i,int e) { if(i>e) return; else if(i==e) { if(s[i]==‘(‘||s[i]==‘)‘) printf("()"); else if(s[i]==‘[‘||s[i]==‘]‘) printf("[]"); } else if(pos[i][e]==-1) { printf("%c",s[i]); print(i+1,e-1); printf("%c",s[e]); } else { print(i,pos[i][e]); print(pos[i][e]+1,e); } } int main() { // freopen("input.txt","r",stdin); gets(s); // cin>>s; int len=strlen(s); memset(dp,0,sizeof dp); memset(pos,0,sizeof pos); for(int i=0;i<len;i++) { dp[i][i]=1; } for(int l=1;l<len;l++) { for(int i=0;l+i<len;i++) { int e=l+i; dp[i][e] = 0x7fffffff; if(march(s[i],s[e])) { dp[i][e]=dp[i+1][e-1]; pos[i][e]=-1; // cout<<"匹配:"<<i<<‘ ‘<<e<<‘ ‘<<dp[i][e]<<endl; } for(int j=i;j<e;j++) { if(dp[i][e]>dp[i][j]+dp[j+1][e]) { dp[i][e]=dp[i][j]+dp[j+1][e]; pos[i][e]=j; // cout<<i<<‘ ‘<<e<<‘ ‘<<dp[i][e]<<endl; } } } } print(0,len-1); printf("\n"); }
原文地址:https://www.cnblogs.com/zgncbsylm/p/10593482.html