POJ 2955-Brackets(括號匹配-區間DP)
Brackets
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5484 | Accepted: 2946 |
Description
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 sequence, then (s) and [s] are regular brackets sequences, and
- if a and b are regular brackets sequences, then ab is a regular brackets sequence.
- no other sequence is a regular brackets sequence
For instance, all of the following character sequences are regular brackets sequences:
(), [], (()), ()[], ()[()]
while the following character sequences are not:
(, ], )(, ([)], ([(]
Given a brackets sequence of characters a1a2 … an, your goal is to find the length of the longest regular brackets sequence that is a subsequence of s. That is, you wish to find the largest m such that for indices i1, i2, …, im where 1 ≤ i1 < i2 < … < im ≤ n, ai1ai2 … aim is a regular brackets sequence.
Given the initial sequence ([([]])]
, the longest regular brackets subsequence is
[([])]
.
Input
The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters
(
, )
, [
, and ]
; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.
Output
For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.
Sample Input
((())) ()()() ([]]) )[)( ([][][) end
Sample Output
6 6 4 0 6
Source
題目意思:
最大括號匹配數。解題思路:
From定義dp [ i ] [ j ] 為串中第 i 個到第 j 個括號的最大匹配數目
那麼我們假如知道了 i 到 j 區間的最大匹配,那麼i+1到 j+1區間的是不是就可以很簡單的得到。
那麼 假如第 i 個和第 j 個是一對匹配的括號那麼 dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
那麼我們只需要從小到大列舉所有 i 和 j 中間的括號數目,然後滿足匹配就用上面式子dp,然後每次更新dp [ i ] [ j ]為最大值即可。
更新最大值的方法是列舉 i 和 j 的中間值,然後讓 dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ f ] + dp [ f+1 ] [ j ] ) 。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 202
#define INF 999999
int dp[MAXN][MAXN];
int main()
{
string s;
while(cin>>s)
{
if(s=="end") break;
memset(dp,0,sizeof(dp));
int i,j,k,f,len=s.size();
for(i=1; i<len; i++)
for(j=0,k=i; k<len; j++,k++)
{
if((s[j]=='('&&s[k]==')')||(s[j]=='['&&s[k]==']'))
dp[j][k]=dp[j+1][k-1]+2;
for(f=j; f<k; f++)
dp[j][k]=max(dp[j][k],dp[j][f]+dp[f+1][k]);
}
//len-dp[0][len-1]表示需要補充多少括號才能都匹配成功
cout<<dp[0][len-1]<<endl;
}
return 0;
}
相關文章
- POJ2955 Brackets (區間DP)Racket
- 【棧】括號匹配
- interleave字串;及括號匹配分析字串
- HDU 5831 Rikka with Parenthesis II (括號匹配)
- 資料結構括號匹配問題資料結構
- 括號匹配;及找數字續分析
- LeetCode 3: PairsOfParentheses (括號匹配問題)LeetCodeAI
- 括號匹配的檢驗問題(C++)C++
- 區間dp
- POJ1141 ZOJ1463 Brackets Sequence【區間dp】Racket
- 【DP】區間DP入門
- c++物件建立帶括號與無括號的區別C++物件
- 括號匹配檢驗 資料結構運用資料結構
- JSON 字串中的中括號和大括號區別詳解JSON字串
- JavaScript 函式呼叫時帶括號和不帶括號的區別JavaScript函式
- UVA 673 括號的匹配——經典棧的應用
- poj1179 區間dp(記憶化搜尋寫法)有巨坑!
- POJ 1068-Parencodings(模擬-包含括號個數)Encoding
- 理解正規表示式中的括號 (),方括號 [] 和大括號 {}
- 【區間dp】石子合併
- 【資料結構】棧的應用--括號的匹配(c++)資料結構C++
- [動態規劃] 區間 dp動態規劃
- 括號畫家
- 區分import 什麼時候使用 花括號{ }Import
- poj 3468 區間更新 整個區間加一個數和區間求和操作
- 區間dp 合併石子問題
- POJ1745Divisibility(dp)
- JavaScript中圓括號()和方括號[]的一個特殊用法JavaScript
- (poj3468)A Simple Problem with Integers(區間更新)
- poj 3237 樹鏈剖分(區間更新,區間查詢)
- Shell 括號總結
- Swift之花括號Swift
- 最長有效括號
- 【題解】括號序列
- 正則中括號點符號符號
- POJ 2486 Apple Tree(樹形dp)APP
- POJ 1925 Spiderman(線性dp)IDE
- POJ 3744 概率dp+矩陣矩陣