poj2955_区间dp

题目链接: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\n", dp[0][len - 1]);
34     }
35     return 0;
36 }

 

posted @ 2016-05-27 22:40  海无泪  阅读(115)  评论(0编辑  收藏  举报