一本通1572括号配对
1572:括号配对
时间限制: 1000 ms 内存限制: 524288 KB
题目描述
Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。
以下是 GBE 的定义:
- 空表达式是 GBE
- 如果表达式
A
是 GBE,则[A]
与(A)
都是 GBE - 如果
A
与B
都是 GBE,那么AB
是 GBE
下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。
输入格式
输入仅一行,为字符串 BE。
输出格式
输出仅一个整数,表示增加的最少字符数。
样例
样例输入
[])
样例输出
1
数据范围与提示
对于 100% 的数据,输入的字符串长度小于 100。
sol:开始的时候头脑发热以为O(n)扫一遍就没了,发现只要 ”([)]“ 这样的数据就跪了,于是老老实实写n^3dp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int N=105; char S[N]; int n,dp[N][N]; int main() { // freopen("kh1.in","r",stdin); int i,j,k; scanf("%s",S+1); n=strlen(S+1); for(i=2;i<=n;i++) { for(j=1;j+i-1<=n;j++) { int l=j,r=j+i-1; if((S[l]=='('&&S[r]==')')||(S[l]=='['&&S[r]==']')) dp[l][r]=max(dp[l][r],dp[l+1][r-1]+2); for(k=l;k<r;k++) dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]); } } printf("%d\n",n-dp[1][n]); return 0; } /* input []) output 1 input ][][(())((([]))) output 2 */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!