zoukankan      html  css  js  c++  java
  • 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
    ",dp[0][length-1]);
        }
    }
  • 相关阅读:
    Python学习笔记 第四天
    Python学习笔记 第三天
    linux系统优化(CentOS7)
    ARMS踩坑合集
    zabbix报错合集(附解决方法)
    keepalived
    ansible
    nginx
    安装虚拟机
    linux发展、redhat与centos的区别
  • 原文地址:https://www.cnblogs.com/00isok/p/10638673.html
Copyright © 2011-2022 走看看