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
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define maxn 200+10
int t, n;
string s;
int d[maxn][maxn];//表示s[i...j]至少需要填上幾個括號(閉區間)
bool match(char p, char q)
void dp()
for (int i = n - 2; i >= 0; i--)//起點逆序列舉
for (int j = i + 1; j < n; j++)//終點順序列舉,保證子區間已經計算過 }
void print(int i, int j)//分三種獨立情況,每次都只執行一種便返回
int ans = d[i][j];
if (match(s[i], s[j]) && ans == d[i + 1][j - 1])//第一種轉移情況
for (int k = i; k < j; k++)//第二種轉移情況
if (ans == d[i][k] + d[k + 1][j]) }
int main()
return 0;
}
uva 1626 括號序列
這道題目是劉汝佳演算法入門中的一道動態規劃題目。要求新增最少括號得到乙個規則序列。先來看看它的狀態轉移,稍有複雜。邊界條件就是s為空是d s 為0,s位單字元時d s 1。另外需要注意的就是不管s是否進行第一種轉移,都要嘗試第二種轉移。include include include include ...
Uva 1626,括號序列
題意 給定乙個字串,看是否括號匹配,不匹配加括號,加最少的括號使得匹配。輸出該結果。分析 解題思路和切木棍很類似。d i,j i j 要加最少多少括號,他一定等於 分兩種情況,一 s s d i,j d i 1,j 1 二 d i,j min d i,k d k 1,j 注意 輸入有空行。inclu...
UVA 1626括號序列DP
題目背景 我們將正規括號序列定義如下 空序列是正規括號序列。如果s是乙個正規括號序列,那麼 s 和 s 都是正規括號序列。如果a和b都是正規括號序列,那麼ab是乙個正規括號序列。例如,下面這些序列都是正規括號序列 而下面這些不是正規括號序列 題目描述 給你一些含有字元 和 的括號序列。你需要找乙個最...