A - Brackets POJ - 2955 (区间DP模板题)

题目链接: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\n",dp[0][len-1]);
30 }
31 return 0;
32 }

猜你喜欢

转载自www.cnblogs.com/letlifestop/p/10528807.html