zoukankan      html  css  js  c++  java
  • POJ

    题目:

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

    思路:

    区间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
    "); 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
    ",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
    ",dp[1][2]);
    //        printf("%d
    ",dp[3][4]);
    //        printf("%d
    ",dp[1][4]);
    //        printf("%d
    ",dp[1][5]);
            printf("%d
    ",dp[0][length-1]);
        }
        return 0;
    }
  • 相关阅读:
    bzoj4734
    51nod1056
    51nod1048
    51nod1248
    51nod1044
    51nod1132
    51nod1146
    51nod1226
    Spring Boot: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
    sqlserver命令创建数据库和表 demo
  • 原文地址:https://www.cnblogs.com/sykline/p/10497140.html
Copyright © 2011-2022 走看看