输出一个串里面能匹配的括号数
状态转移方程:
if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')
dp[i][j]=dp[i+1][j-1]+2;
然后再区间合并
1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<iostream> 6 #include<queue> 7 #include<stack> 8 #include<cmath> 9 #include<set> 10 #include<algorithm> 11 #include<vector> 12 // #include<malloc.h> 13 using namespace std; 14 #define clc(a,b) memset(a,b,sizeof(a)) 15 #define LL long long 16 const int inf = 0x3f3f3f3f; 17 const double eps = 1e-5; 18 const double pi = acos(-1); 19 // inline int r(){ 20 // int x=0,f=1;char ch=getchar(); 21 // while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();} 22 // while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 23 // return x*f; 24 // } 25 int dp[110][110]; 26 char s[110]; 27 int main(){ 28 // freopen("in.txt","r",stdin); 29 while(gets(s)!=NULL){ 30 if(s[0]=='e') break; 31 // cout<<s<<endl; 32 int len=strlen(s); 33 clc(dp,0); 34 for(int i=len-2;i>=0;i--){ 35 for(int j=i+1;j<len;j++){ 36 if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') 37 dp[i][j]=dp[i+1][j-1]+2; 38 for(int k=i;k<j;k++)//区间合并 39 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); 40 } 41 } 42 printf("%d ",dp[0][len-1]); 43 } 44 return 0; 45 }