区间DP
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char s[1000]; int dp[105][105]; int main() { int i,j,k; while(~scanf(" %s",s)) { if(strcmp(s,"end")==0) break; int len=strlen(s); for(i=len-1; i>=0; i--) s[i+1]=s[i]; memset(dp,0,sizeof(dp)); for(i=1; i<=len; i++) //长度 { for(j=1; j<=len; j++) //起点 { int w=i+j-1;//终点 if(w<=j||w>len) continue; if((s[j]==‘(‘&&s[w]==‘)‘)||(s[j]==‘[‘&&s[w]==‘]‘)) dp[j][w]=dp[j+1][w-1]+2; for(k=j; k<w; k++) dp[j][w]=max(dp[j][w],dp[j][k]+dp[k+1][w]); } } printf("%d\n",dp[1][len]); } return 0; }
时间: 2024-09-30 05:35:05