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