UVa1626 Brackets sequence

来源:互联网 发布:数据交换的三种方式 编辑:程序博客网 时间:2024/06/10 06:34

        括号匹配题。。总觉得以前看过,但是没做出来。也是区间的状态转移dp,dp(l,r)表示l~r区间内最少加括号数,可以转移到dp(l+1,r-1)(两端配对的情况下)和dp(l,k)+dp(k,r)。然后需要记录路径,递归路径输出一种结果。这题输入输出有坑,害我WA了好多发。。


#include <iostream>    #include <stdio.h>    #include <cmath>    #include <algorithm>    #include <iomanip>    #include <cstdlib>    #include <string>    #include <memory.h>    #include <vector>    #include <queue>    #include <stack>    #include <map>  #include <set>  #include <ctype.h>    #define INF 1000000  #define ll long long#define min3(a,b,c) min(a,min(b,c))  using namespace std;  //string str;char str[110];int dp[110][110];int path[110][110];void print(int l,int r){if(l>r)return;if(l==r){switch (str[l]){case '(':case ')':cout<<"()";break;case '[':case ']':cout<<"[]";break;}return;}if(path[l][r]==-1){cout<<str[l];print(l+1,r-1);cout<<str[r];}else{print(l,path[l][r]);print(path[l][r]+1,r);}}int main(){int t;cin>>t;getchar();while(t--){//scanf("%s",str);//getline(cin,str);gets(str);gets(str);int len=strlen(str);for(int i=0;i<len;i++){dp[i][i]=1;dp[i+1][i]=0;}for(int d=1;d<len;d++){for(int i=0;i+d<len;i++){dp[i][i+d]=INF;if( (str[i]=='('&&str[i+d]==')')||(str[i]=='['&&str[i+d]==']') ){dp[i][i+d]=min(dp[i][i+d],dp[i+1][i+d-1]);path[i][i+d]=-1;}for(int k=i;k<i+d;k++){if(dp[i][k]+dp[k+1][i+d]<dp[i][i+d]){dp[i][i+d]=dp[i][k]+dp[k+1][i+d];path[i][i+d]=k;}}}}print(0,len-1);cout<<endl;if(t)cout<<endl;}return 0;}


0 0
原创粉丝点击