栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022牛客多校2 K-Link with Bracket Sequence I

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022牛客多校2 K-Link with Bracket Sequence I

输入
3
2 2
()
2 4
)(
2 4
()
输出
1
1
2

 题目大意:已知b是一个长度为m的合法括号序列,a是b的一个子序列,现在我们知道a的长度,问满足条件的b有多少种。

解题思路:动态规划的思想。

状态表示:dp[i][j][k]表示b的前i个字符,和a的总共子序列长度为j,左括号比右括号多k个的情况。这样我们最终要求的答案就是dp[m][n][0]。

状态转移:对于当前的位置上括号的选择,可以选择左括号也可以选择右括号,此时与a序列匹配的对应的位置上也有两种情况,所以说我们当前的选择和a序列原有的字符各有两种可能,所以共有4种可能,因为对于同一种选择,由于a的原序列的不同会导致两种不同的状态表示。

上代码:

#include 
#include 
#include 
#include 
using namespace std;
const int N=210;
const int mod=1e9+7;
int dp[N][N][N],f[N][N][N];
int n,m;
char s[N];
void solve()
{
	cin>>n>>m>>s+1;
	memset(f,0,sizeof f);
	f[0][0][0]=1; 
	for(int i=0;i0)//当前位置选择右括号 
				{
					if(s[j+1]==')')
					f[i+1][j+1][k-1]=(f[i+1][j+1][k-1]+f[i][j][k])%mod;
					else
					f[i+1][j][k-1]=(f[i+1][j][k-1]+f[i][j][k])%mod; 
				}
				//当前位置选择左括号 
				if(s[j+1]=='(')
				f[i+1][j+1][k+1]=(f[i+1][j+1][k+1]+f[i][j][k])%mod;
				else
				f[i+1][j][k+1]=(f[i+1][j][k+1]+f[i][j][k])%mod; 
				
			}
		cout<>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026595.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号