POJ 1141 Brackets Sequence

来源:互联网 发布:美联储 8月cpi数据 编辑:程序博客网 时间:2024/06/04 20:44
#include <cstdio>#include <cstring>#include <algorithm>#define INF 1000000000using namespace std;char s[110];int d[110][110];int path[110][110];int v[110][110];int dp(int i,int j){        int &ans = d[i][j];        if(i>j) return 0;        if(ans != -1) return ans;        ans = INF;        if(s[i]=='('&&s[j]==')'||           s[i]=='['&&s[j]==']') {                if(ans > dp(i+1,j-1)){                    path[i][j] = 1;                    ans = dp(i+1,j-1);                }           }        if(s[i]=='(' || s[i]=='[') {            if(ans > dp(i+1,j)+1){                path[i][j] = 2;                ans = dp(i+1,j)+1;            }        }        if(s[j]==')'||s[j]==']') {            if(ans>dp(i,j-1)+1){                path[i][j] = 3;                ans = dp(i,j-1)+1;            }        }        for(int k = i; k < j; k++){            if(ans>dp(i,k)+dp(k+1,j)){                ans = dp(i,k)+dp(k+1,j);                v[i][j] = k;                path[i][j] = 4;            }        }        return ans;    }    void output(int i,int j){        if(i>j) return;        if(path[i][j] == 1){            printf("%c",s[i]);            output(i+1,j-1);            printf("%c",s[j]);        }else if(path[i][j] == 2){            printf("%c",s[i]);            if(s[i]=='(') printf(")");            else printf("]");            output(i+1,j);        }else if(path[i][j] == 3){            output(i,j-1);            if(s[j]==']') printf("[");            else printf("(");            printf("%c",s[j]);        }else if(path[i][j] == 4){            output(i,v[i][j]);            output(v[i][j]+1,j);        }    }int main(){    while(gets(s)){            memset(d,-1,sizeof(d));            memset(path,0,sizeof(path));            memset(v,0,sizeof(v));            int n = strlen(s);            dp(0,n-1);            output(0,n-1);            printf("\n");        }        //while(1);        return 0;}

0 0