当前位置:网站首页>“蔚来杯“2022牛客暑期多校训练营2 K.[Link with Bracket Sequence I] 括号序列 DP
“蔚来杯“2022牛客暑期多校训练营2 K.[Link with Bracket Sequence I] 括号序列 DP
2022-07-26 01:23:00 【HeartFireY】
K.Link with Bracket Sequence I (DP)
题目分析
给定长度为 n n n的括号序列(不保证合法性),求在此基础上生成的长度为 m m m括号序列的方案数。
设 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]表示插入括号的数量为 i i i、使用的原来的序列中的括号数量为 j j j,左括号比右括号多 k k k时的方案数。那么最终答案为 d p [ m − n ] [ n ] [ 0 ] dp[m - n][n][0] dp[m−n][n][0]。那么考虑如何设计状态转移:
首先枚举插入的括号数量,原来的括号序列和左括号比右括号多的数量。
如果目前枚举到的括号为左括号,并且使用的原括号的数量 < n <n <n,就可以将该括号放入最终序列中,即为:
d p [ i ] [ j + 1 ] [ k + 1 ] = ( d p [ i ] [ j + 1 ] [ k + 1 ] + d p [ i ] [ j ] [ k ] ) % m o d dp[i][j + 1][k + 1] = (dp[i][j + 1][k + 1] + dp[i][j][k]) \% mod dp[i][j+1][k+1]=(dp[i][j+1][k+1]+dp[i][j][k])%mod
如果此时枚举到的是一个右括号,并且 k > 0 k>0 k>0,即左括号的数量大于右括号的数量,并且使用的原括号的数量 < n <n <n,就将该右括号放入最终序列:
d p [ i ] [ j + 1 ] [ k − 1 ] = ( d p [ i ] [ j + 1 ] [ k − 1 ] + d p [ i ] [ j ] [ k ] ) % m o d dp[i][j + 1][k - 1] = (dp[i][j + 1][k - 1] + dp[i][j][k]) \% mod dp[i][j+1][k−1]=(dp[i][j+1][k−1]+dp[i][j][k])%mod
如果使用的括号数量为 n n n,或当前枚举到右括号,则可以插入左括号:
d p [ i + 1 ] [ j ] [ k + 1 ] = ( d p [ i + 1 ] [ j ] [ k + 1 ] + d p [ i ] [ j ] [ k ] ) % m o d dp[i + 1][j][k + 1] = (dp[i + 1][j][k + 1] + dp[i][j][k]) \% mod dp[i+1][j][k+1]=(dp[i+1][j][k+1]+dp[i][j][k])%mod
当 k > 0 k > 0 k>0时,如果使用原序列括号的数目为 n n n,或当前枚举到左括号,则可以插入右括号:
d p [ i + 1 ] [ j ] [ k − 1 ] = ( d p [ i + 1 ] [ j ] [ k − 1 ] + d p [ i ] [ j ] [ k ] ) % m o d dp[i + 1][j][k - 1] = (dp[i + 1][j][k - 1] + dp[i][j][k]) \% mod dp[i+1][j][k−1]=(dp[i+1][j][k−1]+dp[i][j][k])%mod
Code
#include <bits/stdc++.h>
#pragma gcc optimize(2)
#pragma g++ optimize(2)
// #define int long long
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, mod = 1e9 + 7;
int dp[220][220][220];
inline void solve(){
// memset(dp, 0, sizeof(dp));
int m, n; cin >> n >> m;
string s; cin >> s;
// if(n & 1 || (m - n) & 1) { cout << 0 << endl; return; }
dp[0][0][0]=1;
for (int i = 0; i <= m - n; ++i)
for (int j = 0; j <= n; ++j)
for (int k = 0; k <= m; ++k){
if (s[j] == '(' && j < n)
dp[i][j + 1][k + 1] = (dp[i][j + 1][k + 1] + dp[i][j][k]) % mod;
else
dp[i + 1][j][k + 1] = (dp[i + 1][j][k + 1] + dp[i][j][k]) % mod;
if (k > 0){
if (s[j] == ')' && j < n)
dp[i][j + 1][k - 1] = (dp[i][j + 1][k - 1] + dp[i][j][k]) % mod;
else
dp[i + 1][j][k - 1] = (dp[i + 1][j][k - 1] + dp[i][j][k]) % mod;
}
}
cout << dp[m - n][n][0] << endl;
for(int i = 0; i <= m + 2; i++)
for(int j = 0; j <= n + 2; j++)
for(int k = 0; k <= m + 2; k++) dp[i][j][k] = 0;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; cin >> t;
while(t--) solve();
return 0;
}
边栏推荐
- [software development specification III] [software version naming Specification]
- Mulda: a multilingual data augmentation framework for low resource cross linguistic ner reading notes
- Sqli-labs Less7
- TV software burning
- Easyrecovery15 data recovery software with high recovery rate and high download volume
- Tencent employees' salary: the real 985 graduation salary, do you think I can be saved? Netizen: daily salary?
- Pycharm automatically adds header comments when creating py files
- Understand Linglong platform unified access service from simple to deep Monet
- What if win11 cannot open its own anti-virus software? Win11's built-in anti-virus function cannot be turned on
- Four common simple and effective methods for changing IP addresses
猜你喜欢

Sqli-labs Less7

Record a failure caused by a custom redis distributed lock

网络性能评估工具 ping/mtr

FreeBSD bnxt以太网驱动源码阅读记录二:

Detailed explanation of at and crontab commands of RHCE and deployment of Chrony

NLP introduction + practice: Chapter 4: using pytorch to manually realize linear regression

"Yuanqi Cola" is not the end point, "China Cola" is

MulDA: A Multilingual Data Augmentation Framework for Low-Resource Cross-Lingual NER 阅读笔记

【ICKIM 2022】第四届知识与信息管理国际会议

Machine learning: Bayesian Networks
随机推荐
【Go】如何控制协程的最大并发数
EasyRecovery15下载量高的恢复率高的数据恢复软件
8. Learn Mysql to create data tables
NodeJS 基于 Dapr 构建云原生微服务应用,从 0 到 1 快速上手指南
《分布式微服务电商》专题(一)-项目简介
Redis数据结构详解,结合书本
[unity] random generation of two-dimensional cave map
第二届中国Rust开发者大会来啦,完整议程大曝光!
What should I do when my blog is attacked by hackers?
4QAM、16QAM 调制与解调仿真电路,观察并分析QAM星座图和误码率曲线【matlab代码】
[secsha concept] original reverse supplement
Leetcode 537. complex multiplication (netizens' thoughts, ashamed)
Understand Linglong platform unified access service from simple to deep Monet
[Code] refers to the repeated number in the offer 03 array
Causes of signal degradation in optical fiber communication
Fastjason handles generics
健身房一年关店8000家,逆势盈利的工作室是怎么开的?
Server available resources query script
FreeBSD bnxt以太网驱动源码阅读记录二:
Tutorial on the principle and application of database system (057) -- MySQL exercises