zoukankan      html  css  js  c++  java
  • poj2955:括号匹配,区间dp

    题目大意:

    给一个由,(,),[,]组成的字符串,其中(),[]可以匹配,求最大匹配数

    题解:
    区间dp:

    dp[i][j]表示区间 [i,j]中的最大匹配数

    初始状态 dp[i][i+1]=(i,i+1可以匹配)?2:0

    状态转移见代码

    代码:

    #include <iostream>
    #include <stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<string>
    #include<ctype.h>
    using namespace std;
    #define MAXN 10000
    string s;
    int dp[105][105];
    int ok(int x,int y)
    {
        return (s[x]=='('&&s[y]==')')||(s[x]=='['&&s[y]==']');
    }
    int main()
    {
        while(cin>>s,s!="end")
        {
            memset(dp,0,sizeof(dp));
            int n=s.length();
            for(int k=1;k<n;k++)
            {
                for(int i=0;i+k<n;i++)
                {
                    if(ok(i,i+k))
                    {
                        dp[i][i+k]=2+dp[i+1][i+k-1];                        //匹配
                    }
                    for(int j=i;j<i+k;j++)
                    {
                        dp[i][i+k]=max(dp[i][i+k],dp[i][j]+dp[j+1][i+k]);   //不匹配
                    }
                }
            }
            cout<<dp[0][n-1]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    【转】数学题目大集合
    hdu3534,个人认为很经典的树形dp
    GYM
    HDU
    POJ
    POJ
    POJ
    set的经典应用
    天梯赛训练1 7-9 集合相似度
    天梯赛训练1 7-8 查验身份证
  • 原文地址:https://www.cnblogs.com/oneshot/p/4124993.html
Copyright © 2011-2022 走看看