POJ - 2955 Brackets (区间DP)

题目:

给出一个有括号的字符串,问这个字符串中能匹配的最长的子串的长度。

思路:

区间DP,首先枚举区间长度,然后在每一个长度中通过枚举这个区间的分割点来更新这个区间的最优解。还是做的少。

代码:

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAX 1000000000
#define FRE() freopen("in.txt","r",stdin)

using namespace std;
const int maxn = 105;
char str[maxn];
int dp[maxn][maxn];

int main()
{
    //FRE();
    while(gets(str))
    {
        if(strcmp(str,"end")==0) { break; }
        if(strcmp(str,"")==0) {printf("0\n"); break;}
        int length = strlen(str);
        for(int i=0; i<length; i++)
        {
            for(int j=0; j<length; j++)
            { dp[i][j] = 0; }
        }
        //printf("length:  %d\n",length);
        for(int len=1; len<length; len++)//枚举区间的长度
        {
            for(int i=0; i+len<length; i++)
            {
                int j = i+len;
                if((str[i]=='(' && str[j]==')') || (str[i]=='['&&str[j]==']'))
                {
                    dp[i][j] = max(dp[i+1][j-1]+2,dp[i][j]);//当前这个区间是由哪个区间得来的
                }
                for(int k=i; k<=j; k++)//更新这个区间的最优解
                {
                    dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]);
                }
            }
        }
//        printf("%d\n",dp[1][2]);
//        printf("%d\n",dp[3][4]);
//        printf("%d\n",dp[1][4]);
//        printf("%d\n",dp[1][5]);
        printf("%d\n",dp[0][length-1]);
    }
    return 0;
}

 

posted @ 2019-03-08 17:30  sykline  阅读(136)  评论(0编辑  收藏  举报