「LOJ10150」括號配對


【題目】

Hecy 又接了個新任務:BE 處理。BE 中有一類被稱為 GBE。

以下是 GBE 的定義:

空表達式是 GBE
如果表達式 A 是 GBE,則 [A] 與 (A) 都是 GBE
如果 A 與 B 都是 GBE,那么 AB 是 GBE

樣例輸入

[])

樣例輸出

1

【思路】

區間DP

設f[i][j]是區間i~j的最小操作數

方程:f[i][j] = min{f[i][k]+f[k+1][j]}

若a[i] == a[j] f[i][j]=min(f[i][j],f[i+1][j-1]);

代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read(){
	char chr = getchar();	int f = 1,ans = 0;
	while(!isdigit(chr)) {if(chr == '-') f = -1;chr = getchar();}
	while(isdigit(chr))  {ans = (ans << 3) + (ans << 1) + chr - '0';chr = getchar();}
	return ans* f ;
}
void write(int x){
	if(x < 0) putchar('-');
	if(x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
int f[105][105],n,m;
char a[105];
bool check(char a, char b){
	if(a == '(' && b == ')') return 1;
	if(a == '[' && b == ']') return 1;
	return 0;
}
int main(){
	scanf("%s",a + 1);
	n = strlen(a + 1);
	for(int i = 1;i <= n;i++)
		f[i][i] = 1;
	for(int len=2;len<=n;len++)
		for(int i=1;i+len-1<=n;i++){
			int j=i+len-1;
			f[i][j]=0x3f3f3f3f;
			for(int k=i;k<=j;k++)
				f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
			if(check(a[i],a[j])) f[i][j]=min(f[i][j],f[i+1][j-1]);
		}
	write(f[1][n]);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM