POJ2955 Brackets (區間DP)

bigbigship發表於2014-11-25

題目連結:

http://poj.org/problem?id=2955


題意:

一個區間內最長的匹配的括號的最大長度


分析:

我們設DP[i][j]表示從i,到j 的最長的匹配的括號的長度,

如果i-1與j+1是匹配的話 那麼 DP[i-1][J+1]=DP[i][j]+2;

DP[i][j]=max{DP[i][j],dp[i][k]+dp[k+1][j]};


程式碼如下:

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

const int maxn = 110;

int dp[maxn][maxn];
char a[maxn];

bool judge(int i,int j)
{
    if(a[i]=='('&&a[j]==')'||a[i]=='['&&a[j]==']')
        return true;
    return false;
}

int main()
{
    while(~scanf("%s",a)){
        if(strcmp(a,"end")==0) break;
        int len=strlen(a);
        memset(dp,0,sizeof(dp));
        for(int i=2;i<=len;i++){//列舉長度
            for(int j=0;j+i-1<len;j++){//列舉起點
                int e = j+i-1;
                if(judge(j,e)) dp[j][e]=dp[j+1][e-1]+2;
                for(int k=j;k<e;k++)
                    dp[j][e]=max(dp[j][k]+dp[k+1][e],dp[j][e]);
            }
        }
        printf("%d\n",dp[0][len-1]);
    }
    return 0;
}


相關文章