POJ 2955 Brackets (区间DP)

<题目链接>

题目大意:

问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<=100)串中最多的匹配字符个数。

解题分析:
区间DP果题。令$dp[i][j]$为区间$[l,r]$中最多能够匹配的字符个数,对于区间两端字符能够匹配的情况,$dp[[l][r]$能够由$dp[l+1][r-1]+2$转移过来(对于区间长度为2,且两端符号能够匹配的情况特判一下),然后就是进行区间DP的$O(n^3)$转移了。

#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

int dp[105][105];
string str;
bool juge(int l,int r){
    if(str[l]=='('&&str[r]==')')return true;
    if(str[l]=='['&&str[r]==']')return true;
    return false;
}
int main(){
    while(cin>>str){
        if(str=="end")break;
        memset(dp,0,sizeof(dp));
        int length=str.size();
        for(int len=1;len<=length;len++){
            for(int l=0;l+len-1<length;l++){
                int r=l+len-1;
                if(juge(l,r)&&len==2)dp[l][r]=2;     
                else if(juge(l,r)&&len>2)dp[l][r]=dp[l+1][r-1]+2;  
                for(int k=l;k<r;k++)     
                    dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
            }
        }
        printf("%d\n",dp[0][length-1]);
    }
}

 

posted @ 2019-04-01 20:22  悠悠呦~  阅读(170)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end