http://acm.tongji.edu.cn/showproblem.php?problem_id=1271
/**
* <problem>
* 括号序列
* 定义如下规则序列(字符串):
* 1 空序列是规则序列;
* 2 如果S是规则序列,那(S)和[S]也是规则序列;
* 3 如果A和B都是规则序列,那么AB也是规则序列.
* 例如,下面的字符串都是规则序列:
* (), [], (()), ([]), ()[], ()[()]
* 现在,给出一些由'('、')'、'['、']'构成的序列,请添加尽量少的括号,得到一个规则序列。
* Example
* input ())()[()]]
* output 2
* </problem>
* <algorithm>
* Dynamic Programming
* </algorithm>
* @author bbflyerwww
*/
#include<stdio.h>
#include<string.h>
#define MAX 300
#define INF 10000
int map[MAX][MAX];
char s[MAX];
int lns;
int main()
{
while(scanf("%s",s) != EOF) {
lns = strlen(s);
/*init*/
for(int i = 0; i < lns; i++)
for(int j = 0; j < lns; j++)
map[i][j] = 0;
/*Dynamic Programming*/
for(int k = 0; k < lns; k++) {
for(int j = k, i = 0; j < lns; i++, j++) {
if(i == j) {
map[i][j] = 1;
} else {
int min = INF;
for(int t = i; t < j; t++){
if(min > map[i][t] + map[t+1][j])
min = map[i][t] + map[t+1][j];
}
if(s[i] == '(' && s[j] == ')' && min > map[i+1][j-1]) {
min = map[i+1][j-1];
}
if(s[i] == '[' && s[j] == ']' && min > map[i+1][j-1]) {
min = map[i+1][j-1];
}
map[i][j] = min;
}
}
}
/*show the result*/
printf("%d/n",map[0][lns-1]);
}
return 0;
}