当前位置:网站首页>Link with Bracket Sequence II(杭电多校赛)
Link with Bracket Sequence II(杭电多校赛)
2022-07-30 06:10:00 【beyond+myself】
题目链接
题意:有m种括号,现在给你一个已知序列长度但不完整的括号序列,问有多少种填充方式使得其最终成为一个合法的括号序列,其中括号序列满足以下3种规则:
1:a[i]>0表示此位置为左括号
2:a[i]<0表示此位置为右括号
3:a[i]==0表示此位置为未知括号
题解:开始的时候想到了用二维dp,dp[i][j]表示匹配第i个括号,左括号和右括号相差j个,这样可以保证遍历到每个括号也可以通过cnt保证括号的合法性。但是不合题意,题中a[i]和-a[i]是相互对应的,这样dp无法保证是不重不漏的。题中的范围是500,我们想要再加一维dp,但是题中的约束条件只够两维。
这样我们换个思路,我们这道题的被卡住的地方是不知道当前的括号要和哪个去匹配,所以我们就暴力去匹配,假设我们当前匹配第i个,我们去暴力匹配前面1-i,这样我们就可以想到了区间dp。我们用dp[l][r]表示l~r的合法括号数,所有的方案就是dp[l][k]*dp[k+1][r],这样是怎么保证不重的,我们可以每次匹配的时候只让当前的括号与l表示括号匹配,这样就能保证不重,因为只能由一个括号和l匹配,所以每次都能保证是不同的
此博客学习与以下文章:正解请戳此处:正解
下面是AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
const int mod=1e9+7;
int n,m;
int a[550];
int dp[550][550];
int dfs(int l,int r)
{
if((r-l+1)%2) return 0;//奇数个括号
if(r-l+1==0) return 1;
if(r-l+1==2)
{
if(a[l]>0&&a[r]==-a[l]) return 1;
else if(a[l]==0&&a[r]<0) return 1;
else if(a[l]>0&&a[r]==0) return 1;
else if(a[l]==0&&a[r]==0) return m;
else return 0;
}
if(dp[l][r]!=-1) return dp[l][r];//记忆化搜索
int res=0;
if(a[l]>0)
{
for(int i=l+1;i<=r;i+=2)
{
if(a[i]==-a[l]||a[i]==0) res=(res%mod+(dfs(l+1,i-1)%mod*dfs(i+1,r)%mod)%mod);
}
}
else if(a[l]==0)
{
for(int i=l+1;i<=r;i+=2)//枚举区间长度的过程,必须都是偶数,这里也类似于剪了一个小枝条
{
if(a[i]<0) res=(res%mod+(dfs(l+1,i-1)%mod*dfs(i+1,r)%mod)%mod)%mod;
if(a[i]==0) res=(res%mod+(m%mod*dfs(l+1,i-1)%mod*dfs(i+1,r)%mod)%mod)%mod;
}
}
return dp[l][r]=res;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
dp[i][j]=-1;
}
}
for(int i=1;i<=n;i++) cin>>a[i];
cout<<dfs(1,n)%mod<<endl;
}
return 0;
}
这里用记忆化搜索的话就很简洁,因为边界都单独考虑出来了而且还可以降低复杂度。
边栏推荐
猜你喜欢
IDEA搜索插件无结果一直转圈圈的解决办法
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
What new materials are used in the large aircraft C919?
[GO Language Basics] 1. Why do I want to learn Golang and get started with GO language
Boot process and service control
云服务器零基础部署网站(保姆级教程)
mysql高阶语句(一)
Equation Derivation Proof of Vector Triple Product
树状数组的基本用法
redis实现分布式锁的原理
随机推荐
LVM and disk quotas
New material under the plastic restriction order - polylactic acid (PLA)
Keil compile size and storage instructions
申请内存,std::transform和AVX256指令集用例和执行速度比较
goto语句
bean的生命周期
“AI教练”请进家,家庭智能健身蓬勃发展
Keil软件中map文件解析
Go uses the mencached cache
进制转换。。。
Go 使用 freecache 缓存
【day5】数组
Universal js time date format conversion
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
头条二面:MySQL中有几种常见的 SQL 错误用法?
2020 数学建模之旅
ARM体系结构概述
go : use gorm to modify data
Develop common tool software
如何实时计算日累计逐单资金流