标签:区间dp
Language:
Brackets Sequence
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 ()[()] Source |
区间dp
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 305 #define INF 0x3f3f3f3f int dp[N][N],vis[N][N]; char a[N]; 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; }
poj 1141 Brackets Sequence(区间dp)
标签:区间dp
原文地址:http://blog.csdn.net/u014737310/article/details/43906543