poj1141

来源:互联网 发布:网络侵权责任纠纷 编辑:程序博客网 时间:2024/06/05 19:05

dp

dp[i][j]表示串从i到j需要添加的括号数,显然,如果字符串长度为一,dp[i][i]=1;当大于一的时候:

如果str[i]与str[j]匹配,则dp[i][j]=dp[i+1][j-1];否则dp[i][j]=min(dp[i][k]+dp[k+1][j])  (i<=k<j)

用path[i][j]记录k的位置,递归输出括号。

具体见代码:

#include<iostream>#include<cstdio>#include<cstring>#define MAX 111using namespace std;char ch[MAX];int dp[MAX][MAX],path[MAX][MAX];void out(int l,int r){    if(l>r)        return ;    if(l==r)    {        if(ch[l]=='('||ch[l]==')')            printf("()");        else printf("[]");    }    else if(path[l][r]==-1)    {        printf("%c",ch[l]);        out(l+1,r-1);        printf("%c",ch[r]);    }    else    {        out(l,path[l][r]);        out(path[l][r]+1,r);    }}int main(){    int i,j;    int len,temp;    cin>>ch;    len=strlen(ch);    for(i=0;i<MAX;i++)        dp[i][i]=1;    int t;    for(t=1;t<len;t++) //枚举子串的长度,由1至len;    {        for(i=0;i<len-t;i++)  //i为串的首指针,j为尾指针;        {            j=i+t;            dp[i][j]=111111111;            if(ch[i]=='('&&ch[j]==')'||ch[i]=='['&&ch[j]==']')            {                dp[i][j]=dp[i+1][j-1];                path[i][j]=-1;            }            for(int k=i;k<j;k++)            {                if(dp[i][j]>dp[i][k]+dp[k+1][j])                {                    dp[i][j]=dp[i][k]+dp[k+1][j];                    path[i][j]=k;                }            }        }    }    out(0,len-1);    cout<<endl;    return 0;}




0 0
原创粉丝点击