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

2021-08-04 06:59:08 字數 1237 閱讀 4500

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:6 描述

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

如:是匹配的

()是匹配的

((]是不匹配的

([)]是不匹配的

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

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

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

樣例輸入

4

()((]

([)]

樣例輸出

003

2

區間dp,計算出每個區間匹配所需括號的最小個數,然後重新整理最小值即可;

此時會有兩種情況

區間的左端和右端括號匹配的情況,此時dp[i][j]=dp[i+1][j-1],即是去除左右兩段括號後的狀態

不匹配的情況,dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

#include#include#include#include#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=105;

int dp[n][n];

char s[n];

int main()

{ int t,n;

scanf("%d",&t);

while(t--)

{mem(dp,0);

scanf("%s",s+1);

n=strlen(s+1);

for(int i=1;i<=n;i++)dp[i][i]=1;

for(int d=1;d<=n-1;d++)

{for(int i=1;i<=n-d;i++)

{int j=i+d;

dp[i][j]=inf;

if(s[i]+1==s[j]||s[i]+2==s[j])

dp[i][j]=min(dp[i][j],dp[i+1][j-1]);

for(int k=i;k

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

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

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

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

NYOJ15 括號匹配 二 區間DP

pid 15 dp i j 表示從i到j至少須要加入多少個括號才幹滿足匹配條件.初始化 if i j dp i j 1 else dp i j inf 狀態轉移 當i j時 if match str i str j dp i j min dp i j d i 1 j 1 然後切割區間,找最優切割點k...