您的位置:首页 > 其它

ACM: 简单动态规划题 poj 2955

2016-05-19 23:21 423 查看
                                           
Brackets
 

Description

We give the following
inductive definition of a “regular brackets” sequence:

the empty sequence is a regular brackets sequence,

if s is a regular brackets sequence, then (s) and
[s] are regular brackets sequences, and

if a and b are regular brackets sequences, then
ab is a regular brackets sequence.

no other sequence is a regular brackets sequence

For instance, all of the following character sequences are
regular brackets sequences:

(), [], (()), ()[], ()[()]


while the following character sequences are not:

(, ], )(, ([)], ([(]


Given a brackets sequence of characters
a1a2 … an,
your goal is to find the length of the longest regular brackets
sequence that is a subsequence of s. That is, you wish to
find the largest m such that for indices
i1, i2, …, im
where 1 ≤ i1 <
i2 < … <
imn, ai1ai2 …
aim is a regular brackets sequence.

Given the initial sequence
([([]])]
, the longest
regular brackets subsequence is
[([])]
.

Input

The input test file will
contain multiple test cases. Each input test case consists of a
single line containing only the characters
(
,
)
,
[
, and
]
; each input test
will have length between 1 and 100, inclusive. The end-of-file is
marked by a line containing the word “end” and should not be
processed.

Output

For each input case, the program should print the length of the
longest possible regular brackets subsequence on a single line.

Sample Input

((()))

()()()

([]])

)[)(

([][][)

end

Sample Output

6

6

4

0

6

 

题意: 计算最大的括号匹配数目.

 

解题思路:

      
1. dp[i][j]: 第i个字符到到第j个字符最大的匹配数.

      
2. (str[i] == '(' && str[j] == ')')
|| (str[i] == '[' && str[j] ==
']')

           
dp[i][j] = max(dp[i][j] , dp[i+1][j-1]+2);

         
dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j]);

 

代码:

#include
<cstdio>

#include <iostream>

#include <cstring>

using namespace std;

#define MAX 105

char str[MAX];

int dp[MAX][MAX];

int len;

inline int max(int a,int b)

{

 return a > b ? a : b;

}

int main()

{

// freopen("input.txt","r",stdin);

 while(scanf("%s",str) != EOF)

 {

  if(strcmp(str,"end") ==
0)

   break;

  memset(dp,0,sizeof(dp));

  len = strlen(str);

  for(int p = 0; p
< len; ++p)

  {

   for(int i =
0, j = p; j < len; ++i, ++j)

   {

    if(
(str[i] == '(' && str[j] == ')') ||
(str[i] == '[' && str[j] == ']')
)

     dp[i][j]
= max(dp[i][j],dp[i+1][j-1]+2);

    for(int
k = i; k < j; ++k)

     dp[i][j]
= max(dp[i][j],dp[i][k]+dp[k+1][j]);

   }

  }

  printf("%d\n",dp[0][len-1]);

 }

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: