标签:name seq iostream mes mem put namespace short lse
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 35049 | Accepted: 10139 | Special Judge |
Description
Input
Output
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"); }
poj 1141 Brackets Sequence 区间dp,分块记录
标签:name seq iostream mes mem put namespace short lse
原文地址:https://www.cnblogs.com/zgncbsylm/p/10593482.html