题目链接:http://poj.org/problem?id=2955
题目大意:括号匹配,(s)表示字符串s外有一对括号,它是合法的,那么他的最大个数就可以是 s包含的个数+2;ab是合法的,表示字符串ab的长度可以是a包含的个数+b包含的个数
理解题意就简单多了
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 #include <cmath> 7 #include <set> 8 #include <map> 9 #include <vector> 10 using namespace std; 11 12 char a[110], b[5] = "end"; 13 int dp[110][110]; 14 int main() 15 { 16 while(~scanf("%s", a)) 17 { 18 if(strcmp(a, b) == 0) 19 break; 20 memset(dp, 0, sizeof(dp)); 21 int len = strlen(a); 22 for(int l = 1; l < len; l++)//表示长度 23 { 24 for(int i = 0, j = l; j < len; i++, j++)//i为起点,j为终点 25 { 26 if(a[i] == '(' && a[j] == ')' || (a[i] == '[' && a[j] == ']')) 27 dp[i][j] = dp[i + 1][j - 1] + 2; 28 for(int k = i; k <= j; k++)//注意k从i开始,因为不算起点可能个数最大啊,终点也是也是一样哦(不过k<j也是可行的,自己想想吧) 29 dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]); 30 // cout << i << " " << j << " " << dp[i][j] << endl; 31 } 32 } 33 printf("%d ", dp[0][len - 1]); 34 } 35 return 0; 36 }