UVA 1626 Brackets sequence(括号匹配 + 区间DP)

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E

题意:添加最少的括号,让每个括号都能匹配并输出

分析:dp[i][j]表示第i个到第j个需要添加的最少的括号,pos[i][j] = k;表示i到j间第k个需要加括号;

如果str[i]和str[j]匹配,那么dp[i][j] = max(dp[i + 1][j - 1], dp[i][j]);

如果str[i]和str[j]不匹配,那么dp[i][j] = max(dp[i][j], dp[i][k]+dp[k + 1][j]);     i<= k < j;之前想过k为什么不能等于j,

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 using namespace std;
 6 const int MAX = 120;
 7 const int INF = 0x3f3f3f3f;
 8 int dp[MAX][MAX],pos[MAX][MAX];
 9 char str[MAX];
10 int n;
11 void DP()
12 {
13     n = strlen(str);
14 
15     memset(dp, 0, sizeof(dp));
16     for(int i = 0; i < n; i++)
17         dp[i][i] = 1;
18     for(int p = 1; p < n; p++)
19     {
20         for(int i = 0; i < n; i++)
21         {
22             int j = i + p;
23             if(j >= n)
24                 break;
25             dp[i][j] = INF;
26             if( (str[i] == '(' && str[j] == ')') || ( str[i] == '[' && str[j] == ']' ) )
27             {
28                 if(dp[i][j] > dp[i + 1][j - 1])
29                     dp[i][j] = dp[i + 1][j - 1];
30             }
31             pos[i][j] = -1;
32             for(int k = i; k < j; k++)
33             {
34                 int temp = dp[i][k] + dp[k + 1][j];
35                 if(temp < dp[i][j])
36                 {
37                     dp[i][j] = temp;
38                     pos[i][j] = k;
39                 }
40             }
41         }
42     }
43 }
44 void Print(int beg, int End)
45 {
46     if(beg > End)
47         return;
48     if(beg == End)
49     {
50         if(str[beg] == '(' || str[beg] == ')')
51             printf("()");
52         if(str[beg] == '[' || str[beg] == ']')
53             printf("[]");
54     }
55     else
56     {
57         if(pos[beg][End] == -1)
58         {
59             printf("%c", str[beg]);
60             Print(beg + 1, End - 1);
61             printf("%c", str[End]);
62         }
63         else
64         {
65             Print(beg, pos[beg][End]);
66             Print(pos[beg][End] + 1, End);
67         }
68     }
69 }
70 int main()
71 {
72     int t;
73     scanf("%d", &t);
74     getchar();
75     getchar();
76     for(int i = 0; i < t; i++)
77     {
78         gets(str);
79         DP();
80         Print(0, n - 1);
81         printf("\n");
82         if(i < t - 1)
83             printf("\n");
84         getchar();
85     }
86 
87     return 0;
88 }
View Code

 

转载于:https://www.cnblogs.com/zhaopAC/p/5176040.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值