ZOJ 1463 Brackets Sequence

题目本身,没什么好说的了。记得第一天练DP的时候就是叫我做的这个题,这个哪里做得出来啊。现在怎么说也比原来好点了。

这个题实际上是跟POJ 1141是一样的,几乎一模一样。

但是这个ZOJ太奇葩了,这个题目的输入让我无语了。后来我看了一下提交的结果。。提交了两千多次,没有PE,只有WA。。。这个就无语了,题目要求的那些空行让人凌乱啊。

下面贴代码:

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int MAX = 1<<30;
 6 char str[120];
 7 int a[120][120],dp[120][120];
 8 void printans(int i,int j)
 9 {
10     if(i > j)
11         return;
12     if(i == j)
13     {
14         if(str[i] == '(' || str[i] == ')')
15             cout<<"()";
16         if(str[i] == '[' || str[i] == ']')
17             cout<<"[]";
18     }
19     else if(a[i][j] == -1)
20     {
21         cout<<str[i];
22         printans(i + 1,j - 1);
23         cout<<str[j];
24     }
25     else
26     {
27         printans(i,a[i][j]);
28         printans(a[i][j] + 1,j);
29     }
30 }
31 int main()
32 {
33     int ncase,n,i,j,k,m,len;
34     cin>>ncase;
35     getchar();
36     for(n = 1;n <= ncase;n++)
37     {
38         if(n > 1)
39             cout<<endl;
40         getchar();
41         cin.getline(str,101);
42         len = strlen(str);
43         for(i = 0;i < len;i++)
44         {
45             for(j = 0;j < len;j++)
46             {
47                 if(i < j)
48                     dp[i][j] = MAX;
49                 else if(i == j)
50                     dp[i][j] = 1;
51                 else
52                     dp[i][j] = 0;
53             }
54         }//初始化dp数组
55         for(m = 1;m <= len;m++)
56         {
57             for(i = 0;i < len - m;i++)
58             {
59                 j = i + m;
60                 if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']'))
61                 {
62                     dp[i][j] = dp[i + 1][j - 1];
63                     a[i][j] = -1;
64                 }
65                 for(k = i;k <= j;k++)
66                 {
67                     int t = dp[i][k] + dp[k + 1][j];
68                     if(t < dp[i][j])
69                     {
70                         dp[i][j] = t;
71                         a[i][j] = k;
72                     }
73                 }
74             }
75         }//for i
76         printans(0,len - 1);
77         cout<<endl;
78     }//while
79     return 0;
80 }

 

posted @ 2012-04-18 17:42  浙西贫农  阅读(206)  评论(0编辑  收藏  举报