Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp

阅读: 评论:0

Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp

Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp

题目链接:
题意:
定义一个合法串:

(1),’(‘的总数 == ‘)’的总数。

(2), 串中所有前缀 满足 ‘(‘的个数 >= ‘)’的个数。

题意:给定一个合法串的长度n和一个长度为m的中间串s,要求你找到一个p串和q串,使得p + s + q是一个合法串且长度为n。问有多少种不同的方案数。 结果 % (1e9+7)。

解法:
摘自:
设置dp[i][j]表示长度为i的合法串且’(‘的个数 - ‘)’的个数 == j的方案数。

我们称j为该串的平衡度。其实dp[i][j] = dp[i][-j],因为’(‘和’)’可以互换。

转移有dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1]。

那么我们可以枚举p串的长度和平衡度,找到合法的q串。再统计方案数。

注意:我们不能仅仅要求p + s + q合法就够了,必须保证选出的p + s也是一个合法串。

假设p + s长度为i且平衡度为j(j>=0)。那么q串长度为n-m-i,平衡度为-j。

//CF 629D#include <bits/stdc++.h>
using namespace std;
long long dp[2005][2005]; //dp[i][j]表示长度为i的合法串且'('的个数 - ')'的个数 == j的方案数
const int mod = 1e9+7;
int n, m;
string s;
int main()
{memset(dp, 0, sizeof(dp));dp[0][0] = 1LL;for(int i = 1; i <= 2000; i++){dp[i][0] = dp[i-1][1];for(int j = 1; j <= i; j++){dp[i][j] = (dp[i][j] + (dp[i-1][j+1] + dp[i-1][j-1])%mod)%mod;}}cin >> n >> m >> s;int sum = 0;int minn = 0x3f3f3f3f;for(int i = 0; i < m; i++){if(s[i] == '(') sum++;else sum--;minn = min(minn, sum);}int len = n-m;long long ans = 0;for(int i = 0; i <= len; i++){for(int j = 0; j <= i; j++){if(j+minn<0 || len-i<j+sum) continue;ans = (ans + dp[i][j]*dp[len-i][j+sum] % mod ) %mod;}}cout << ans << endl;
}

本文发布于:2024-02-04 05:05:05,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170699717152316.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Div   Codeforces   Famil   dp   Brackets
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23