• 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;
    }
  • 相关阅读:
    程序的本质复杂性和元语言抽象
    编译器词法消歧设计
    关于分工的思考 (Thoughts on Division of Labor)
    数据即代码
    类型的本质和函数式实现
    二叉树迭代器算法
    kvm虚拟化存储管理
    kvm网络虚拟化管理
    kvm虚拟机的四种网络模式
    Linux 中交换空间 (swap)应该分多大才好?
  • 原文地址:https://www.cnblogs.com/sykline/p/10497140.html
Copyright © 2020-2023  润新知