CODEVS 3657 括號序列

2022-05-14 06:04:37 字數 1635 閱讀 6379

【問題描述】

我們用以下規則定義乙個合法的括號序列:

(1)空序列是合法的

(2)假如s是乙個合法的序列,則 (s) 和[s]都是合法的

(3)假如a 和 b 都是合法的,那麼ab和ba也是合法的

例如以下是合法的括號序列:

(), , (()), (), (), ()[()]

以下是不合法括號序列的:

(, [, ], )(, (), ([()

現在給定一些由'(', ')', '[', ,']'構成的序列 ,請新增盡量少的括號,得到乙個合法的括號序列。

【輸入】

輸入包括號序列s。含最多100個字元(四種字元: '(', ')', '[' and ']') ,都放在一行,中間沒有其他多餘字元。

【輸出】

使括號序列s成為合法序列需要新增最少的括號數量。

【樣例輸入】

([()
【樣例輸出】

2
【樣例說明】
最少新增2個括號可以得到合法的序列:()[()]或([()])
【資料範圍】s的長度<=100 (最多100個字元)。

解題思路

1

program

kuohao;

2uses math;

3const maxn=255;4

var5 f:array[0..maxn,0..maxn] of

longint;

6s:string;

7p,i,j,k,min,flag:longint;

8begin

9readln(s);

10for i:=1

to length(s) do f[i,i]:=1;11

for p:=1

to length(s) do//列舉次數

12for i:=1

to length(s)-p do//列舉起點

13begin

14 min:=maxlongint;

15 flag:=0

;16 j:=i+p;

17if ((s[i]='

(') and(s[j]='

)')) or((s[i]='

[')and (s[j]=']'

))18

then

19begin

20 f[i,j]:=f[i+1,j-1

];21 flag:=1;22

end;

23for k:=i to j-1

do//列舉決策

24begin

25if f[i,k]+f[k+1,j]then min:=f[i,k]+f[k+1

,j];

26end;27

if (minor (flag=0) then f[i,j]:=min;

28 writeln(f[1

,length(s)]);

29end.

Codevs 3657括號序列

題目大意 中文題,略 題目思路 區間dp 這個題是問需要新增多少個括號使之成為合法括號序列,那麼我們可以先求有多少合法的括號匹配,然後用字串長度減去匹配的括號數就行 狀態轉移方程主要是對於我們列舉的區間 dp i j 如果 i 和 j 處的括號能夠匹配,則dp i j dp i 1 j 1 1 因為...

codevs 3657 括號序列

時間限制 1 s 空間限制 256000 kb 題目等級 gold 題目描述 description 我們用以下規則定義乙個合法的括號序列 1 空序列是合法的 2 假如s是乙個合法的序列,則 s 和 s 都是合法的 3 假如a 和 b 都是合法的,那麼ab和ba也是合法的 例如以下是合法的括號序列 ...

codevs 3657 括號序列

題目描述 description 我們用以下規則定義乙個合法的括號序列 1 空序列是合法的 2 假如s是乙個合法的序列,則 s 和 s 都是合法的 3 假如a 和 b 都是合法的,那麼ab和ba也是合法的 例如以下是合法的括號序列 以下是不合法括號序列的 現在給定一些由 構成的序列 請新增盡量少的括...