• A


    题目链接:https://cn.vjudge.net/contest/276243#problem/A

    题目大意:给你一个字符串,让你求出字符串的最长匹配子串。

    具体思路:三个for循环暴力,对于一个区间i,j,我们先计算出这个区间内合法的有多少个,也就是

     1 if(check(k,j))dp[k][j]=dp[k+1][j-1]+2; 

    然后就开始求这个区间内的最大值就可以了。

     1 dp[k][j]=max(dp[k][j],dp[k][pos]+dp[pos+1][j]); 

    AC代码:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 using namespace std;
     5 # define ll long long
     6 const int maxn = 2e2+100;
     7 const int mod =1e6;
     8 # define LL_inf 0x3f3f3f3f3f3f3f
     9 char str[maxn];
    10 int dp[maxn][maxn];
    11 bool check(int u,int v){
    12   //  cout<<str[u]<<" "<<str[v]<<endl;
    13 if((str[u]=='('&&str[v]==')')||(str[u]=='['&&str[v]==']'))return true;
    14 return false;
    15 }
    16 int main(){
    17 while(~scanf("%s",str)){
    18 if(str[0]=='e')break;
    19 memset(dp,0,sizeof(dp));
    20 int len=strlen(str);
    21 for(int i=1;i<len;i++){
    22 for(int j=i,k=0;j<len;k++,j++){
    23 if(check(k,j))dp[k][j]=dp[k+1][j-1]+2;
    24 for(int pos=k;pos<j;pos++){
    25 dp[k][j]=max(dp[k][j],dp[k][pos]+dp[pos+1][j]);
    26 }
    27 }
    28 }
    29 printf("%d
    ",dp[0][len-1]);
    30 }
    31 return 0;
    32 }
  • 相关阅读:
    MongoDB
    新公司管理经营
    剪辑理论
    色彩理论
    商业模式
    电影手法
    [好文转载] 每个程序员都应该学习使用Python或Ruby
    File类递归
    【CF1447】div2复盘
    【心得体会】11.9-11.15
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10528807.html
Copyright © 2020-2023  润新知