1. 程式人生 > >DP-括號匹配

DP-括號匹配

括號匹配(二)

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:6
描述
給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
輸入
第一行輸入一個正整數N,表示測試資料組數(N<=10)
每組測試資料都只有一行,是一個字串S,S中只包含以上所說的四種字元,S的長度不超過100
輸出
對於每組測試資料都輸出一個正整數,表示最少需要新增的括號的數量。每組測試輸出佔一行
樣例輸入
4
[]
([])[]
((]
([)]
樣例輸出
0
0
3
2

思路:

//f[i][j]表示從i到j所需要的最小的匹配數。
//1.當i到j-1之間沒有一個能和j匹配時,f[i][j]=f[i][j-1]+1
//2.當存在k在i與j-1之間能與j匹配時,f[i][j]=min(f[i][k-1]+f[k+1][j-1]);

程式碼實現:

#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int f[200][200];
bool is(char a,char b){
    if(a=='(' && b==')')
        return true;
    else if(a=='[' && b==']')
        return true;
    return false;
}
int main(){
    int nc;
    cin>>nc;
    while(nc--){
        string s;
        cin>>s;
        int p=s.size();
        memset(f,0,sizeof(f));
        for(int i=0;i<=p;i++)
            f[i][i]=1;
        for(int j=2;j<=p;j++){
            for(int i=j-1;i>=1;i--){
                f[i][j]=f[i][j-1]+1;
                for(int k=i;k<j;k++){
                    if(is(s[k-1],s[j-1]))
                        f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j-1]);
                }
            }
        }
        cout<<f[1][p]<<endl;
    }

return 0;}

//f[i][j]表示從i到j所需要的最小的匹配數。
//1.當i到j-1之間沒有一個能和j匹配時,f[i][j]=f[i][j-1]+1
//2.當存在k在i與j-1之間能與j匹配時,f[i][j]=min(f[i][k-1]+f[k+1][j-1]);


相關推薦

POJ 2955 Brackets (區間dp 括號匹配)

total con cpp class pre following roc put inpu Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissio

POJ2955BRACKETS(區間DP括號匹配

ongl unity jvm wss lfa 匹配 區間 ack .com %E7%94%A8UNITY5%E5%BC%80%E5%8F%91%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%89%8B%E6%9C%BA%E6%B8%B8%E6%88%8F%28

區間dp括號匹配

closed lse cin turn amp names strlen pie 區間 POJ2955 匹配則加一,不需要初始化 1 //#include<bits/stdc++.h> 2 #include<iostream> 3 #inc

[區間DP] 括號匹配 POJ2955

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12798  

DP-括號匹配

括號匹配(二) 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:6 描述給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。 如: []是匹配的 ([])[]是匹配的 ((]是

區間dp 括號匹配 nyoj 15

題目連結:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 括號匹配(二) 時間限制:1000 ms  |  記憶體限制:65535 

括號匹配問題(區間dp

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

【日常刷題】最長括號匹配DP

最長括號匹配 這道題目看似可以使用棧來做,實則用DP可以更加簡單。 我們設 f [ i

NYOJ37、1023、15(迴文串、括號匹配、記憶化搜尋、dp,區間dp)

  迴文字串 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 輸入 第一行給出整數N(0<N<100) 接下來的N行,每行一個字串,每個字串長度不超過1000. 輸出 每行輸出所需新增的最少字元數

51nod 1791 合法括號子段 括號匹配演算法+dp計數

給定一串括號串,對於其中每個左括號‘(’最多隻能找到一個與之相匹配的右括號‘)’。顯然,在括號串固定的情況下,括號的匹配是固定不變的。 根據題意,空串為合法括號,“()”為合法括號串,若A為合法括號串則”(A)”為合法括號串。 那麼我們可以先用括號匹配演算法(利用棧)

區間dp模型(石子歸併,括號匹配,整數劃分)

區間dp顧名思義就是在一個區間上進行的一系列動態規劃。對一些經典的區間dp總結在這裡。 1) 石子歸併問題 描述:有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過

括號匹配 (區間dp

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

括號匹配(二)(區間dp

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

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

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

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

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

POJ2955 Brackets(區間DP括號匹配

POJ2955 首先考慮怎麼樣定義dp讓它滿足具有通過子結構來求解、 定義dp [ i ] [ j ] 為串中第 i 個到第 j 個括號的最大匹配數目 那麼我們假如知道了 i 到 j 區間的最大匹

Brackets(區間dp括號匹配

We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence,if s is a regular brackets

NYOJ15-括號匹配(二)-區間DP

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問題及其整理

題目大意:輸入一棵樹的中序遍歷,定義一棵子樹的得分為其左子樹的加分×右子樹的加分+根的分數。求最大得分及先序遍歷注意:1、初始化r[i][i]=i,便於輸出2、初始化dp[i][i-1]=dp[i+1][i]=1。因為在區間中選取一點為root時會取到端點,即左(右)子樹為空

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

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