1. 程式人生 > >括號匹配(二)(區間dp)

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

括號匹配(二)



題目描述:

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

輸入描述:

第一行輸入一個正整數N,表示測試資料組數(N<=10)
每組測試資料都只有一行,是一個字串S,S中只包含以上所說的四種字元,S的長度不超過100

輸出描述:

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

樣例輸入:

複製
4
[]
([])[]
((]
([)]

樣例輸出:

0
0
3
2

題意:找最小的數量能使所有括號匹配;

思路:區間dp[i][j] 代表著i-j的最少需求,把所以只剩自己在中間的dp[i][i]賦值1表示只需要一個就可以,然後i-j中每個小區間

i ~ k,k+1 ~ j一起查詢最小就ok了;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MN = 150;
int dp[MN][MN];
char a[MN];

bool flag(char x,char y)
{
    if ((x == '(' && y == ')') || (x == '[' && y == ']'))
        return true;
    return false;
}

int main()
{
    int i, j, n, m;
    while (~scanf("%d",&n))
    {
        while (n--)
        {
            scanf("%s",a);
            int la = strlen(a);
            memset(dp,0,sizeof(dp));
            for (i = 0;i < la;i++) dp[i][i] = 1; //這裡初始化的是自己獨立時沒有匹配的值;
            for (int len = 1;len < la;len++) //len表示你要查的區間大小i~j;
            {
                for (i = 0;i < la - len;i++) //保證j不越界
                {
                    j = i + len;
                    dp[i][j] = 99999999;//初始化最大
                    if (flag(a[i],a[j]))
                        dp[i][j] = dp[i+1][j-1]; //如果可以配對,i-j最小的需求就等於裡面一層的
                    for (int k = i;k <= j;k++)//i-j中找最小的需求
                        dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
                }
            }
            printf("%d\n",dp[0][la-1]);
        }
    }
    return 0;
}

相關推薦

括號匹配區間dp

括號匹配(二)題目描述:給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是

nyoj 15 括號匹配區間DP

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

括號匹配NYOJ15簡單區間dp

給定一個自然數M,及其二進位制長度N,得到一個N位的二進位制串     b1 b2 ... bN-1 bN 將該串做左旋轉,即b1移到bN後面,得到一個新的二進位制串:     b2 b3 ... bN-1 bN b1 對新的二進位制串再做左旋轉,得二進位制串     b3 b4 ..

括號匹配問題區間dp

最小值 很好 nbsp 需要 簡單的 棧模擬 pri tex 什麽 簡單的檢查括號是否配對正確使用的是棧模擬,這個不必再說,現在將這個問題改變一下:如果給出一個括號序列,問需要把他補全成合法最少需要多少步? 這是一個區間dp問題,我們可以利用區間dp來解決,直接看代碼吧!

括號匹配 區間dp

區間dp 題目大意:給出一個的只有’(‘,’)’,’[‘,’]’四種括號組成的字串,求最多有多少個括號滿足匹配。 題目連結 思路:用dp[i][j]表示區間i~j的最大匹配數,對於dp[i][j] = dp[i + 1][j - 1] + (s[i]和s[

2018GDUT第一場C 遺失的叉樹區間dp

問題描述: 給定一個序列,判斷其是否可能為一個二叉樹的中序遍歷序列,該二叉樹樹邊連線的兩個點的值不能互質。 輸入描述: 第一行一個數字T,表示測試組數 對於每一組測試樣例 第一行一個數字n,表示序列長度 第二行有n個數字ai,表示這個序列 T≤5,n≤500,2

LightOJ - 1422 Halloween Costumes 區間DP

wan things strong cas book article printf ase con Description Gappu has a very busy weekend ahead of him. Because, next weekend is Ha

POJ 1141 Brackets Sequence 區間DP

ive bsp rip mes character har typedef som memset Description Let us define a regular brackets sequence in the following way: 1.

Brackets Sequence POJ - 1141 區間dp

gif == urn ++ char img ems utc pre Brackets Sequence POJ - 1141 題意:給一個括號序列,問最少添加多少個括號似的原序列匹配,並輸出新序列。 用dp[i][j]表示i到j最少添加幾個括號,flag[i][j]表

Brackets POJ - 2955 區間dp

pla clu for eof %d img rac end racket Brackets POJ - 2955 題意:給一個括號序列,問最多有多少個括號是可以配對的。 1 #include<cstdio> 2 #include<algori

Food Delivery ZOJ - 3469 區間dp

位置 turn pro pan return isp ive != truct Food Delivery ZOJ - 3469 題意:快遞員送外賣,n個客戶,起始位置為x,速度為v,每個客戶單位時間不滿意度增加hi,問最少增加多少不滿意度。 每一個客戶可能是從左側送到

CSUOJ-1980 不堪重負的數區間dp

inline 滿二叉樹 -a ems ext div des button problems 1980: 不堪重負的樹 Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Subm

POJ 1991 Turning in Homework區間DP

clu sin highlight sort stream ret spa 作業 ref 題目鏈接 Turning in Homework 考慮區間DP f[i][j][0]為只考慮區間[i, j]且最後在a[i]位置交作業的答案。 f[i][j][1]為只考慮區間[

hdu6212 祖瑪區間DP

tro 位置 表示 中間 ron i+1 strong 就會 題意 題意   有一個長度為n的01串,我們可以在某個地方插入一個0或者1,那麽如果有連續顏色相同的>=3個,那麽這段就會消去,兩邊的合攏。問將所有01串消去,最少需要插入多少個。(n<=200)

修長城 區間DP

urn ret 世紀 log width hide 時間 main gif Time Limit: 1000 ms Memory Limit: 256 MB Description   大家都知道,長城在自然條件下會被侵蝕,因此,我們需要修復。現在是21世紀,

Codeforces 392E Deleting Substrin區間dp

read temp put tdi char i+1 void log ++ 題目大意: ? 給定vi,wi,每次可以在wi中選擇一個子段[l,r]滿足:? |wi-wi+1|=1 (l<=i<r)? 2wi-wi-1-wi+1>=0 (l<i<

【Uva10559】Blocks區間DP

log turn logs efi read etc body pre 數量 Description 題意:有一排數量為N的方塊,每次可以把連續的相同顏色的區間消除,得到分數為區間長度的平方,然後左右兩邊連在一起,問最大分數為多少。 \(1\leq N\leq200\) S

You Are the One HDU - 4283區間dp

eas value script names elf for stdio.h 表示 text You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav

Topcoder SRM 301 Div2-1000 CorrectingParenthesization區間DP

完全 errors 實現 括號 cor ren opc fin 區間dp 題意 給定一個長度為偶數的字符串。這個字符串由三種括號組成。    現在要把這個字符串修改為一個符合括號完全匹配的字符串,改變一個括號的代價為$1$,求最小總代價。 區間DP。令$dp[i

【BZOJ】1260 [CQOI2007]塗色paint區間dp

c++ ide hid event pri display pro == spl 題目 傳送門:QWQ 分析 區間dp, 詳見代碼 代碼 /*****************************************