DP 之 poj 2955

如欲有渐进的学习过程,请 点击打开此处链接
//  [4/4/2014 Sjm]
/*
状态: dp[i][j] := 从位置 i 到位置 j,最长规则串的长度
决策:
1) 若 str[i] == '(' && str[j] == ')',则 dp[i][j] = max(dp[i][j], dp[i + 1][j - 1] + 2);
  (S)= S最长的规则串的长度 + 2
2)若 j-i >= 1, 则:
for (int k = i; k < j; k++)
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
// 将 S 拆成两个部分 S1 和 S2, 若 S1 和 S2 均已求得规则串的最长长度,
// 则此时 S 也可获得规则串的一个长度
*/
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int MAX_N = 100;
 7 int dp[MAX_N][MAX_N];
 8 char str[MAX_N];
 9 
10 int Solve()
11 {
12     memset(dp, 0, sizeof(dp));
13     int mylen = strlen(str);
14     for (int t = 1; t < mylen; t++) {
15         for (int i = 0; i < mylen - t; i++) {
16             int j = i + t;
17             if (('(' == str[i] && ')' == str[j]) || ('[' == str[i] && ']' == str[j]))
18                 dp[i][j] = max(dp[i][j], dp[i + 1][j - 1] + 2);
19             for (int k = i; k < j; k++)
20                 dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
21         }
22     }
23     return dp[0][mylen - 1];
24 }
25 
26 int main()
27 {
28     //freopen("input.txt", "r", stdin);
29     //freopen("output.txt", "w", stdout);
30     while (scanf("%s", str) && str[0] != 'e')
31         printf("%d\n", Solve());
32     return 0;
33 }

 



posted @ 2014-04-05 01:06  JmingS  阅读(169)  评论(0编辑  收藏  举报