d[i][j] 表示i~j不规则括号的个数,和UVA1626几乎一样- -
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int len; char s[105]; int d[105][105]; bool match(char x1,char x2) { if((x1=='[' && x2==']')||(x1=='(' && x2==')')) return true; return false; } void dp() //参考红书上UVA1626的代码 { for(int i=0; i<len; i++) { d[i+1][i]=0; d[i][i]=1; } for(int i=len-2; i>=0; i--) { for(int j=i+1; j<len; j++) { d[i][j]=len; if(match(s[i],s[j])) d[i][j]=min(d[i][j],d[i+1][j-1]); for(int k=i; k<j; k++) d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]); } } } int main() { while(scanf("%s",s)) { if(strcmp(s,"end") == 0) break; len= strlen(s); dp(); printf("%d ",len-d[0][len-1]); } return 0; }