例題9 10 括號序列 UVa1626

2022-09-23 20:15:13 字數 1209 閱讀 4549

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是乙個正規括號序列。例如,下面這些序列都是正規括號序列 而下面這些不是正規括號序列 題目描述 給你一些含有字元 和 的括號序列。你需要找乙個最...