括號匹配(二)NYOJ 區間dp)

2021-08-20 17:08:42 字數 1646 閱讀 5187

括號匹配(二)

時間限制:1000 ms | 記憶體限制:65535 kb

難度:6

描述

給你乙個字串,裡面只包含」(「,」)」,」[「,」]」四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。

如: 是匹配的

()是匹配的

((]是不匹配的

([)]是不匹配的

輸入

第一行輸入乙個正整數n,表示測試資料組數(n<=10)

每組測試資料都只有一行,是乙個字串s,s中只包含以上所說的四種字元,s的長度不超過100

輸出

對於每組測試資料都輸出乙個正整數,表示最少需要新增的括號的數量。每組測試輸出佔一行

樣例輸入 4

() ((]

([)]

樣例輸出

0 0

3 2

**

《演算法藝術與資訊學競賽》

上傳者

張云聰分析:

這是一題比較典型的區間dp題。首先我們需要先定義狀態:dp[i][j]:表示在區間[i,j]需要新增的最少括號個數。根據不同結構,可以分為以下 4 種不同情況來處理:

1)s 形如(s′)或[s′]:

只需把 s′變規則即可,則 f[i,j]= f[i+1,j-1]。

2)s 形如(s′或[s′: 先把 s′化為規則的,右邊加「)」或「]」即可,則 f[i,j]= f[i+1,j]+1。

3)s 形如 s′)或 s′]: 先把 s′化為規則的,左邊加「(」或「[」即可,則 f[i,j]= f[i,j-1]+1

4)把長度大於 1 的序列 sisi+1..sj-1sj分為兩部分: si..sk,sk+1.. sj,分別化為規則序列,則 f[i,j]=f[i,k]+f[k+1,j] ;i<=k<=j-1; 上述 4 種情況取最小值即可。

特殊資料

()() 0

(我就是卡上面那個資料卡了很久)

accepted code:

#include

#include

#include

using

namespace

std;

const

int maxn=205;

int dp[maxn][maxn];

char s[maxn];

int main()

for(int k=i;k1][j]);

}int v1=0x3f3f3f3f,v2=0x3f3f3f3f;

if(s[j]==')'||s[j]==']')

v1=dp[i][j-1]+1;

if(s[i]=='('||s[i]=='[')

v2=dp[i+1][j]+1;

dp[i][j]=min(v1,min(v2,temp));}}

printf("%d\n",dp[0][n-1]);

}}

NYOJ 括號匹配(二) 區間dp

最大加的括號數不就是總的括號數 最大的配對數。include include include using namespace std define clr a,b memset a,b sizeof a const int maxn 2e2 10 int dp maxn maxn char str ...

NYOJ 括號匹配(二) 經典dp

時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描寫敘述 給你乙個字串,裡面僅僅包括 四種符號,請問你須要至少加入多少個括號才幹使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入 第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都僅僅有一行,是...

NYOJ 15 括號匹配(二)區間dp

時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...