1.题目描述:点击打开链接
2.解题思路:本题要求添加尽量少的括号,使得括号序列是一个正规序列。定义d(i,j)表示子串S[i...j]至少需要添加几个括号。根据题意,可知有两种转移方式:
(1)如果S形如(S‘)或[S'],则转移到d(S');
(2)如果S至少有两个字符,则可以分成AB,转移到d(A)+d(B);
边界是:S为空时,d(S)=0,S为单字符时,d(S)=1,。注意不管S是否满足第一条,都要尝试第二种转移方式。否则"[][]"会被转移到"][",然后只能加两个括号了。本题打印的时候需要重新检查哪个决策最好。好处是节约空间,坏处是打印时代码比较复杂,速度较慢。但由于只有少数需要打印,因此基本可以忽略不计。
3.代码:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include