几乎和1554 Folding是一样的题目,区别是这更简单一点。LRJ黑书里拿做动态规划例题的第一道。
类似邮局问题的划分,注意左右有挂号时的状态。
1
#include
<
cstdio
>
2
#include
<
string
>
3
4
#define
min(x,y) ( x < y ? x : y )
5
6
int
T, m[
101
][
101
], L, ch[
101
][
101
];
7
char
str[
101
];
8
9
void
dp ();
10
int
get
(
int
,
int
);
11
void
init ();
12
void
print (
int
,
int
);
13
14
int
main ()
15
{
16
//freopen ( "bracket.in", "r", stdin );
17
scanf ( "%d", &T );
18
gets ( str );
19
int i;
20
for ( i = 0; i < T; i ++ )
21
{
22
if ( i )
23
printf ( "/n" );
24
init ();
25
dp ();
26
//printf ( "%d/n", ch[0][L - 1] );
27
print ( 0, L - 1 );
28
printf ( "/n" );
29
//pt ();
30
}
31
return 0;
32
}
33
34
void
init ()
35
{
36
gets ( str );
37
gets ( str );
38
L = strlen ( str );
39
memset ( m, 0, sizeof ( m ) );
40
memset ( ch, 0xff, sizeof ( ch ) );
41
}
42
43
void
dp ()
44
{
45
int i, j, p, k, t;
46
for ( i = 0; i < L; i ++ )
47
m[i][i] = 1;
48
for ( p = 1; p <= L; p ++ )
49
{
50
for ( i = 0; i + p < L; i ++ )
51
{
52
int ans = 101;
53
j = i + p;
54
if ( str[i] == '(' && str[j] == ')' || str[i] == '[' && str[j] == ']' )
55
{
56
t = m[i + 1][j - 1];
57
if ( ans > t )
58
ch[i][j] = -2, ans = t;
59
}
60
if ( str[i] == '(' || str[i] == '[' )
61
{
62
t = m[i + 1][j] + 1;
63
if ( ans > t )
64
ch[i][j] = i, ans = t;
65
}
66
if ( str[j] == ')' || str[j] == ']' )
67
{
68
t = m[i][j - 1] + 1;
69
if ( ans > t )
70
ch[i][j] = j, ans = t;
71
}
72
for ( k = i; k < j; k ++ )
73
{
74
t = m[i][k] + m[k + 1][j];
75
if ( ans > t )
76
ch[i][j] = k, ans = t;
77
}
78
m[i][j] = ans;
79
}
80
}
81
}
82
83
void
print (
int
i,
int
j )
84
{
85
if ( i > j )
86
return;
87
if ( i == j )
88
{
89
if ( str[i] == '(' || str[i] == ')' )
90
printf ( "()" );
91
else
92
printf ( "[]" );
93
return;
94
}
95
else if ( ch[i][j] == -2 )
96
{
97
printf ( "%c", str[i] );
98
print ( i + 1, j - 1 );
99
printf ( "%c", str[j] );
100
}
101
else if ( ch[i][j] == j )
102
{
103
print ( i, j - 1 );
104
print ( j, j );
105
}
106
else
107
{
108
print ( i, ch[i][j] );
109
print ( ch[i][j] + 1, j );
110
}
111
}
112
113

2

3

4

5

6

7

8

9

10

11

12

13

14

15



16

17

18

19

20

21



22

23

24

25

26

27

28

29

30

31

32

33

34

35



36

37

38

39

40

41

42

43

44



45

46

47

48

49



50

51



52

53

54

55



56

57

58

59

60

61



62

63

64

65

66

67



68

69

70

71

72

73



74

75

76

77

78

79

80

81

82

83

84



85

86

87

88



89

90

91

92

93

94

95

96



97

98

99

100

101

102



103

104

105

106

107



108

109

110

111

112

113

posted on 2008-02-27 13:02 杜仲当归 阅读(3) 评论(0) 编辑 收藏 引用 所属分类: 动态