poj 1141 动态规划进行括号匹配

思路:黑书的例题

#include<iostream>

#include<cstring>

#include<cstdio>

#include<algorithm>

#define Maxn 1010

using namespace std;

int dp[Maxn][Maxn],v[Maxn][Maxn];

char str[Maxn];

void Out(int s,int e)

{

    if(s>e)

        return ;

    if(s==e)

    {

        if(str[s-1]=='('||str[s-1]==')')

            printf("()");

        else

            printf("[]");

        return ;

    }

    if(v[s][e]==-1)

    {

        printf("%c",str[s-1]);

        Out(s+1,e-1);

        printf("%c",str[e-1]);

        return ;

    }

    Out(s,v[s][e]);

    Out(v[s][e]+1,e);

}

int main()

{

    int n,i,j,t,k;

    memset(dp,48,sizeof(dp));

    memset(v,-1,sizeof(v));

    scanf("%s",str);

    n=strlen(str);

    for(i=0;i<=n;i++)

        dp[i][i]=1,dp[i][i-1]=0;

    for(i=1;i<=n;i++)

        for(j=i-1;j>=1;j--){

        if(str[i-1]==')'&&str[j-1]=='('||str[i-1]==']'&&str[j-1]=='[')

        {

            if(dp[i-1][j+1]<dp[i][j])

                dp[i][j]=dp[i-1][j+1],v[j][i]=-1;

        }

        else

        {

            if(dp[i-1][j]<dp[i][j+1])

                dp[i][j]=dp[i-1][j]+1,v[j][i]=i-1;

            else

                dp[i][j]=dp[i][j+1]+1,v[j][i]=j;

        }

        for(k=j;k<i;k++)

        {

            if(dp[i][k+1]+dp[k][j]<dp[i][j])

                dp[i][j]=dp[i][k+1]+dp[k][j],v[j][i]=k;

        }

    }

    Out(1,n);

    printf("\n");

    return 0;

}

 

你可能感兴趣的:(动态规划)