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 }

 

转载于:https://www.cnblogs.com/zhexipinnong/archive/2012/04/18/2455683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值