题意:给你一行字符串(‘(’,‘)’,‘[',']')求最大匹配;
dp[i][j]:在i , j区间的最大匹配数;
注意边界的匹配!!!如第一个案列.............
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream> #include <queue> #include <stack> #include<algorithm> #include<set> using namespace std; #define INF 1e8 #define inf -0x3f3f3f3f #define eps 1e-8 #define ll __int64 #define maxn 250001 #define mol 100007 int main() { char s[110]; int dp[110][110]; while(scanf("%s",s)&&strcmp(s,"end")) { int n=strlen(s); int i,j,k; memset(dp,0,sizeof(dp)); //n--; for(i=n-1;i>=0;i--) { for(j=i+1;j<n;j++) { dp[i][j]=max(dp[i+1][j],dp[i][j-1]);// 关键 for(k=i+1;k<=j;k++) { if(s[i]=='('&&s[k]==')'||s[i]=='['&&s[k]==']') dp[i][k]=max(dp[i][k],dp[i+1][k-1]+2);//关键 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); } } } printf("%d\n",dp[0][n-1]); } return 0; } /* ((())) ()()() ([]]) )[)( ([][][) end */