poj 2955 Brackets (区间dp)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/89256925

题目链接:哆啦A梦传送门

题意:给出一个字符串,找出最多数量的最多括号匹配。

题解:

区间dp。

状态转移:

x字符与y字符匹配 : dp[x][y]+=dp[x+1][y-1]+2。

接着枚举每个中间态。

#include<bits/stdc++.h>
using namespace std;

const int mod=10007;

int dp[110][110];
char str[110];

int main()
{



    while(cin>>str)
    {
        if(strcmp(str,"end")==0) break;

        memset(dp,0,sizeof(dp));

        int n=strlen(str);

        for(int i=1;i<=n;i++)
        {
            for(int j=0;i+j-1<n;j++)
            {
                int x=j,y=i+j-1;
                ///字符x与字符y能匹配
                if(str[x]=='('&&str[y]==')'){
                    dp[x][y]+=dp[x+1][y-1]+2;
                }
                else if(str[x]=='['&&str[y]==']')
                    dp[x][y]+=dp[x+1][y-1]+2;

                    ///枚举每个中间态
                for(int k=x;k<y;k++)
                    dp[x][y]=max(dp[x][y],dp[x][k]+dp[k+1][y]);

            }
        }

        printf("%d\n",dp[0][n-1]);




    }
    return 0;
}

有个自己写的n*n代码,不知为什么过不了,真玄。

#include<bits/stdc++.h>
using namespace std;

const int mod=10007;

int dp[110][110];
char str[110];

int main()
{



    while(cin>>str)
    {
        if(strcmp(str,"end")==0) break;

        memset(dp,0,sizeof(dp));

        int n=strlen(str);

        for(int i=1;i<=n;i++)
        {
            for(int j=0;i+j-1<n;j++)
            {
            int x=j,y=i+j-1;

                if(str[x]=='('&&str[y]==')'){
                    dp[x][y]=max(dp[x][y],dp[x+1][y-1]+2);
                }
                else if(str[x]=='['&&str[y]==']')
                    dp[x][y]=max(dp[x][y],dp[x+1][y-1]+2);

                
                dp[x][y]=max(dp[x][y],max(dp[x+1][y],dp[x][y-1]));
                dp[x][y]=max(dp[x][y],dp[x+1][y-1]);



            }
        }

        printf("%d\n",dp[0][n-1]);




    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/89256925