[BZOJ4350] 括号序列再战猪猪侠 题解
我们设 \(dp_{i,j}\) 表示第 \(i\) 到第 \(j\) 个括号合并为序列且最外层不是括号 \(i\) 的可能性,\(f_{i,j}\) 表示最外层是括号 \(i\) 的可能性。则有:
dp_{i,j}=\sum f_{i,k}(dp_{k+1,j}+f_{k+1,j})\\
f_{i,j}=dp_{i+1,j}+f_{i+1,j}
\end{cases}
\]
当然,并不是所有情况都能合并,所以需要维护 \(p_{i,j,k}\) 和 \(q_{i,j,k}\),表示 \(k\) 能否接在 \(i\) 到 \(j\) 的左侧/包住 \(i\) 到 \(j\)。
时间、空间复杂度均为 \(O(n^3)\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=305,md=998244353;
int t,n,m,f[N][N],dp[N][N];
int p[N][N][N],q[N][N][N];
void solve(){
memset(dp,0,sizeof(dp));
memset(f,0,sizeof(f));
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
cin>>n>>m;
int flag=0;
while(m--){
int x,y;cin>>x>>y;
if(x==y||flag){
flag=1;
continue;
}if(x<y) q[y][y][x]=1;
else p[x][x][y]=1;
}if(flag){
cout<<"0\n";
return;
}for(int i=1;i<=n;i++)
f[i][i]=1;
for(int ln=2;ln<=n;ln++)
for(int i=1,j=ln;j<=n;i++,j++)
for(int k=1;k<=n;k++){
p[i][j][k]|=p[i+1][j][k]|p[i][i][k];
q[i][j][k]|=q[i+1][j][k]|q[i][i][k];
}
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int k=1;k<=n;k++)
p[i][j][k]+=p[i][j][k-1];
for(int ln=2;ln<=n;ln++)
for(int i=1,j=ln;j<=n;i++,j++){
for(int k=i;k<j;k++){
if(p[k+1][j][k]-p[k+1][j][i-1]) continue;
if(p[i][k][j]-p[i][k][k]) continue;
dp[i][j]=(dp[i][j]+(ll)f[i][k]*(dp[k+1][j]+f[k+1][j])%md)%md;
}if(!q[i+1][j][i]) f[i][j]=(f[i+1][j]+dp[i+1][j])%md;
}
cout<<(dp[1][n]+f[1][n])%md<<"\n";
}int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}
[BZOJ4350] 括号序列再战猪猪侠 题解的更多相关文章
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...
- BZOJ4350: 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
- BZOJ4350: 括号序列再战猪猪侠【区间DP】
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列, ...
- 2018.10.25 bzoj4350: 括号序列再战猪猪侠(区间dp)
传送门 区间dp好题. 首先我们并不用把右括号拿进来一起dpdpdp,而是直接用左括号来dpdpdp. 然后定义状态fi,jf_{i,j}fi,j表示区间[l,r][l,r][l,r]的合法方案数. ...
- 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...
- 【UR #2】猪猪侠再战括号序列 题解
题目链接 前言 是的没脑子选手只会做签到题. 思路分析 一开始把题目看成反转括号的状态,直接浪费 \(40\ mins\) . 我们考虑把不确定的"正确括号"转换成一个固定的括号序 ...
- uoj #31. 【UR #2】猪猪侠再战括号序列 贪心
#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...
- 学长小清新题表之UOJ 31.猪猪侠再战括号序列
学长小清新题表之UOJ 31.猪猪侠再战括号序列 题目描述 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫\(\_CallMeGGBond\). 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领 ...
- UOJ#31 【UR #2】猪猪侠再战括号序列
传送门http://uoj.ac/problem/31 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其 ...
- uoj problem 31 猪猪侠再战括号序列
题目大意: 给定一个长度为2n的括号序列.定义一个关于区间[l,r]的翻转操作为位置平移对调. 即翻转")))()("可以得到"()()))((" 用不超过n次 ...
随机推荐
- CSS 样式百分比
1.宽高百分比 元素宽度/高度百分比是基于父级元素的width/height,不包含padding,border 注意:高度百分比一定要求父元素有设置height属性,只设置 min-height 虽 ...
- kube-apiserver 高可用,keepalived + haproxy
为什么要做高可用 在生产环境中,kubernetes 集群中会多多个 master 节点,每个 master 节点上都会部署 kube-apiserver 服务,实现高可用.但是 client 访问 ...
- sql 依据时间间隔分组,获取第一条数据
时序数据的数据量比较大,抛去异常点外,变化相对比较有线性规律,业务上需要对结果进行抽取显示. 原始数据时序标签(部分示例) 根据时间字段,计算时间字段和指定时间的时间戳差值,然后除以固定间隔(示例中间 ...
- Git因换行符不一致导致反复有修改记录
前情 Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理,我公司目前都是基于Git来管理项目代码. 坑位 最近刚刚入职一家新公司,本地环境都配好 ...
- 授权|取消授权MYSQL数据库用户权限
授权 queryusr用户查询test数据库 grant select on test.* to queryusr@'%'; flush PRIVILEGES 收回queryusr用户查询test数据 ...
- 智能存储 | 超质感 HDR 生产,激活你的视神经
视频平台尊贵的会员可以享受 4K HDR 超清视界,各类新型旗舰机都具备拍摄 HDR 视频的能力,3C 产品发布会必提 HDR 超清显示.想必各位看官感受到视觉逐渐被 HDR 浪潮侵袭了,那 HDR ...
- Netty 中ChannelOption的含义以及使用的场景Netty 中ChannelOption的含义以及使用的场景
一.概述 最近在写一个分布式服务框架,打算用netty框架做底层网络通信,关于netty的学习可以参考如下资料: http://blog.csdn.net/column/details/enjoyne ...
- [转]boost使用之编译库及遇到的问题
最近因为在学习网络编程相关的东西,准备学习一下boost,毕竟原生的网络编程太麻烦.看了一下其实windows下想使用起来很简单,就是下载库,然后运行脚本,然后运行exe库就出来.在把头文件和库的目录 ...
- vue辅助函数mapState和mapGetter前面三个点到底是什么意思:对象展开运算符
import store from "./store" computed: { useName: function() { return store.state.userName ...
- Pycharm创建工程及运行程序入门教程
pycharm基础使用步骤 1.下载pycharm2.新建Python工程(1)如下,点击Create New Project (2)选择保存位置,点击create. (3)命名,打开界面如下 (4) ...