zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    pyc文件是什么【转载】
    Linux下的python等操作【转载】
    P1012 拼数 字符串
    P1309 瑞士轮 排序选择 时间限制 归并排序
    商业竞争 三分+背包
    老虎ji 剪枝模拟
    交通灯 并查集
    三色抽卡游戏 博弈论nim
    质数串 乱搞
    自动驾驶系统 bfs
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10528807.html
Copyright © 2011-2022 走看看