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