Brackets Sequence POJ - 1141 (区间dp)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Brackets Sequence POJ - 1141 (区间dp)相关的知识,希望对你有一定的参考价值。
Brackets Sequence
题意:给一个括号序列,问最少添加多少个括号似的原序列匹配,并输出新序列。
用dp[i][j]表示i到j最少添加几个括号,flag[i][j]表示i和j之间需要添加括号的位置。
1 #include<cstdio> 2 #include<algorithm> 3 #include<string> 4 #include<iostream> 5 #include <cstdlib> 6 #include<cstring> 7 using namespace std; 8 const int maxn=110; 9 const int inf=0x3f3f3f3f; 10 int dp[maxn][maxn],flag[maxn][maxn]; 11 char s[maxn]; 12 13 void print(int l,int r){ 14 if(l>r) return ; 15 if(l==r){ 16 if(s[l]==‘(‘||s[l]==‘)‘) printf("()"); 17 else printf("[]"); 18 return ; 19 } 20 if(flag[l][r]==-1){ 21 putchar(s[l]); 22 print(l+1,r-1); 23 putchar(s[r]); 24 }else { 25 print(l,flag[l][r]); 26 print(flag[l][r]+1,r); 27 } 28 } 29 int main(){ 30 while(gets(s)){ 31 memset(dp,0,sizeof(dp)); 32 int len=strlen(s); 33 for(int i=0;i<len;i++) dp[i][i]=1; 34 for(int i=len-2;i>=0;i--) 35 for(int j=i+1;j<len;j++){ 36 dp[i][j]=inf; 37 if(s[i]==‘(‘&&s[j]==‘)‘||s[i]==‘[‘&&s[j]==‘]‘) 38 if(dp[i][j]>dp[i+1][j-1]){ 39 dp[i][j]=dp[i+1][j-1]; 40 flag[i][j]=-1; 41 } 42 for(int k=i;k<j;k++) 43 if(dp[i][j]>dp[i][k]+dp[k+1][j]){ 44 dp[i][j]=dp[i][k]+dp[k+1][j]; 45 flag[i][j]=k; 46 } 47 } 48 print(0,len-1); 49 puts(""); 50 } 51 }
1 #include<cstdio> 2 #include<algorithm> 3 #include<string> 4 #include<iostream> 5 #include <cstdlib> 6 #include<cstring> 7 using namespace std; 8 const int maxn=110; 9 const int inf=0x3f3f3f3f; 10 int dp[maxn][maxn],flag[maxn][maxn]; 11 char s[maxn]; 12 13 void print(int l,int r){ 14 if(l>r) return ; 15 if(l==r){ 16 if(s[l]==‘(‘||s[l]==‘)‘) printf("()"); 17 else printf("[]"); 18 return ; 19 } 20 if(flag[l][r]==-1){ 21 putchar(s[l]); 22 print(l+1,r-1); 23 putchar(s[r]); 24 }else { 25 print(l,flag[l][r]); 26 print(flag[l][r]+1,r); 27 } 28 } 29 int main(){ 30 while(gets(s)){ 31 memset(dp,0,sizeof(dp)); 32 int len=strlen(s); 33 for(int i=0;i<len;i++) dp[i][i]=1; 34 for(int k=1;k<len;k++){ 35 for(int i=0;i+k<len;i++){ 36 int j=i+k; 37 dp[i][j]=inf; 38 if(s[i]==‘(‘&&s[j]==‘)‘||s[i]==‘[‘&&s[j]==‘]‘) 39 if(dp[i][j]>dp[i+1][j-1]){ 40 dp[i][j]=dp[i+1][j-1]; 41 flag[i][j]=-1; 42 } 43 for(int m=i;m<j;m++){ 44 if(dp[i][j]>dp[i][m]+dp[m+1][j]){ 45 dp[i][j]=dp[i][m]+dp[m+1][j]; 46 flag[i][j]=m; 47 } 48 } 49 } 50 } 51 print(0,len-1); 52 puts(""); 53 } 54 }
以上是关于Brackets Sequence POJ - 1141 (区间dp)的主要内容,如果未能解决你的问题,请参考以下文章