题目链接: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 }