題目描述 description
我們用以下規則定義乙個合法的括號序列:
(1)空序列是合法的
(2)假如s是乙個合法的序列,則 (s) 和[s]都是合法的
(3)假如a 和 b 都是合法的,那麼ab和ba也是合法的
例如以下是合法的括號序列:
(), , (()), (), (), ()[()]
以下是不合法括號序列的:
(, [, ], )(, (), ([()
現在給定一些由'(', ')', '[', ,']'構成的序列 ,請新增盡量少的括號,得到乙個合法的括號序列。
輸入描述 input description
輸入包括號序列s。含最多100個字元(四種字元: '(', ')', '[' and ']') ,都放在一行,中間沒有其他多餘字元。
輸出描述 output description
使括號序列s成為合法序列需要新增最少的括號數量
樣例輸入 sample input
([()
樣例輸出 sample output
2
資料範圍及提示 data size & hint【樣例說明】
最少新增2個括號可以得到合法的序列:()[()]或([()])【資料範圍】
s的長度<=100 (最多100個字元)。
題解:狀態很好想,dp[i][j],表示i~j所需要新增的最小括號數,兩種轉移,如果i和j是匹配的,dp[i][j]=min(dp[i][j],dp[i+1][j-1]),表示就是中間的括號數,然後就是列舉斷點k,dp[l][r]=min(dp[l][r],dp[l,k]+dp[k+1,r]),表示把這個序列拆成i~k和k+1~j兩個序列。然後答案就是兩個序列所需的括號數之和。
**:
#include#include#include
#include
#include
#define maxn 200
#define inf 1<<30
using
namespace
std;
char
s[maxn];
intdp[maxn][maxn],b[maxn][maxn];
intn;
bool match(char x,char
y)int dfs(int l,int
r)int
main()
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 括號序列
問題描述 我們用以下規則定義乙個合法的括號序列 1 空序列是合法的 2 假如s是乙個合法的序列,則 s 和 s 都是合法的 3 假如a 和 b 都是合法的,那麼ab和ba也是合法的 例如以下是合法的括號序列 以下是不合法括號序列的 現在給定一些由 構成的序列 請新增盡量少的括號,得到乙個合法的括號序...