专栏文章

题解:P7248 [BalticOI 2012] 括号 (Day1)

P7248题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipni44z
此快照首次捕获于
2025/12/03 14:53
3 个月前
此快照最后确认于
2025/12/03 14:53
3 个月前
查看原文

思路

本题是括号匹配和动态规划,还是比较简单。
已经匹配的括号我们不用管,只需要处理没有匹配的左括号即可。但是考虑到数据范围,普通的二维动态规划空间会炸,需要滚动数组来解决。
fi,jf_{i,j} 表示第到 ii 个位置,未匹配的左括号个数为 jj,那么就有如下状态转移方程。
不是左括号:fi,j=fi1,jf_{i,j}=f_{i-1,j}
是左括号:fi,j=fi1,j1+fi1,j+1f_{i,j}=f_{i-1,j-1}+f_{i-1,j+1}
别忘了取模!!!

Code

CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5,mod=1e9+9;
void read(int &a){
	char ch;int f=1,k=0;ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
	a=k*f;
}
int n,f[2][N];
char ch;
signed main(){
	read(n);
	f[0][0]=1;
	for(int i=1;i<=n;i++){
		cin>>ch;
		int minn=min(i,n-i);
		for(int j=0;j<=minn;j++){
			if(j==0||ch==')') f[i%2][j]=f[(i+1)%2][j+1];
			else f[i%2][j]=(f[(i+1)%2][j+1]+f[(i+1)%2][j-1])%mod;
		}
	}
	cout<<f[n%2][0];
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...