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

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

括號匹配(二)

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



思路:區間DP
dp[i][j]表示子串i…j最少需要新增的括號數

狀態轉移:
S形如(S’)或者[S’]: dp[i+1][j-1]
S形如(S’或者[S’:   dp[i+1][j]+1
S形如S’)或者S’]:   dp[i][j-1]+1
長度大於1: dp[i][k]+dp[k+1][j] (i<=k<=j-1)

程式碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int inf=0x3f3f3f3f;
int dp[110][110];

int main()
{
    int
t,n; scanf("%d",&t); char s[110]; while(t--) { scanf("%s",s+1); n=strlen(s+1); for(int i=1; i<=n; ++i) dp[i][i]=1; for(int l=1; l<=n-1; ++l) for(int i=1; i<=n-l; ++i) { int j=i+l; dp[i][j]=inf; if
((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) dp[i][j]=min(dp[i][j],dp[i+1][j-1]); for(int k=i; k<j; ++k) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } printf("%d\n",dp[1][n]); } return 0; }

相關推薦

nyoj 15-括號匹配 模擬

題目描述: 給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 輸入描述: 第一行輸入一個正整數N,表示測試資料組數(N&l

nyoj 15 括號匹配區間DP

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

NYOJ 15 括號匹配

這個是很早之前寫的,今天又從新敲了一遍!     dp[i][j]表示:從第i個位置到第j個位置至少要新增的括號數目,我們令dp[i][i]表示當前到當前位置至少新增一個括號,假如只有一個括號,那麼dp[i][i] = 1; dp[i][j]:      如果從第i

nyoj 15 括號匹配

#include<cstdio> #include<iostream> #include<string.h> using namespace std; int dp[105][105]; char s[105]; #define INF

nyoj 15 括號匹配

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

括號匹配區間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[

[luoguP2216] [HAOI2007]理想的正方形維單調隊列

++ pla https hide 正方形 closed log 傳送門 name 傳送門 1.先弄個單調隊列求出每一行的區間為n的最大值最小值。 2.然後再搞個單調隊列求1所求出的結果的區間為n的最大值最小值 3.最後掃一遍就行 懶得畫圖,自己體會吧。

[luoguP2601] [ZJOI2009]對稱的正方形維Hash + 二分 || Manacher

getchar() cst ons pro color tar zjoi fine long 傳送門 很蒙蔽,不知道怎麽搞。 網上看題解有說可以哈希+二分搞,也有的人說用Manacher搞,Manacher是什麽鬼?以後再學。 對於這個題,可以從矩陣4個角

LeetCode 543. Diameter of Binary Tree 叉樹的直徑

tween res edge public level 距離 sent java dot Given a binary tree, you need to compute the length of the diameter of the tree. The diamet

LeetCode 563. Binary Tree Tilt 叉樹的傾斜度

tor init 要求 += esc runtime 目標 兩個 out Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as the a

CentOS7 LNMP+phpmyadmin環境搭建、LNMP環境搭建

用戶 lib 關聯 cin 特殊 get deb 分號 yum 上一篇博客我們在虛擬機上安裝了centos7,接下來,就開始安裝lnmp環境吧。 還是跟之前一樣,進入命令行後,先使用su命令切換到root權限。 首先配置防火墻 CentOS 7.0默認使用的是firewa

selenium自動化實戰-基於python語言: 編寫腳本

獲取 pat 打開 border 命令 需要 框架 attribute 一個 上一篇文章說到顯示等待和隱式等待語句,我們繼續學習下面的命令方法。 8. 定位一組元素 這裏書上是自己寫了一個頁面代碼,通過訪問本地這個頁面來舉例。但我覺得找一個現有的頁面自己琢磨更有意思,而且

mysql-5.7.18版本進制包安裝-自定義安裝路徑

mysql linux lnmp mysql-5.7.18版本(二進制包安裝)-自定義安裝路徑安裝路徑:/application/mysql-5.7.181.前期準備mysql依賴libaioyum install -y libaio創建用戶mysql,以該用戶的身份執行mysqluseradd

Aizu - ALDS1_7_B Binary Trees叉樹的表達

二叉 orm print sts ica nod nts sin ostream A rooted binary tree is a tree with a root node in which every node has at most two children.

MySQL之數據引擎

display 一個 etx variable 所在 面向 常熟 配置 dex 什麽是數據引擎   在初識數據中曾經講過關於數據庫相關的一些概念:數據庫 表 記錄等等 mysql中建立的庫===>文件夾 庫中建立的表===>文件而現實生活中我們

前端自動化測試之UI RECORDER、PC錄制

啟動服務 域名 run ports shadow 科學 兼容 webp htm PC錄制教程 準備工作: NodeJs環境 請自行先安裝好nodejs環境,在命令行執行node -v命令成功說明已經安裝成功 Chrome瀏覽器 JAVA環境 UI Recorder We

Python學習筆記015——文件file的常規操作之進制文件

cde enc blog 模式 1byte 二進制文件 整數 style rst 1 字節(byte)的單位 1KB = 2*10 Bytes 1MB = 1KB * 1024 = 2**20 Bytes 1GB = 1KB * 1K * 1K = 2**30 Bytes