括號匹配(二)
時間限制: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...