博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.10.25 bzoj4350: 括号序列再战猪猪侠(区间dp)
阅读量:5334 次
发布时间:2019-06-15

本文共 1212 字,大约阅读时间需要 4 分钟。

区间dp好题。


首先我们并不用把右括号拿进来一起dpdpdp,而是直接用左括号来dpdpdp

然后定义状态fi,jf_{i,j}fi,j表示区间[l,r][l,r][l,r]的合法方案数。
如果没有限制直接分三种情况讨论就行了。

  1. 形如(AB)(AB)(AB)
  2. 形如()AB()AB()AB
  3. 形如(A)B(A)B(A)B

但是现在有了限制。

因此我们枚举决策的时候判当前转移是否合法。
如何判断呢?
我们建立一个数组statstatstat
stat[a][b]!=0stat[a][b]!=0stat[a][b]!=0表示aaa对应的右括号被要求放在bbb对应的右括号前面。
stat[a][b]=0stat[a][b]=0stat[a][b]=0表示aaa对应的右括号可以不放在bbb对应的右括号前面。
这样我们就可以判断两个位置的关系啦。
但是我们还需要判断两段区间的位置关系是否合法。
因此我们对statstatstat维护一个前缀和数组sumsumsum
sum(a,b),(c,d)=0sum_{(a,b),(c,d)}=0sum(a,b),(c,d)=0表示aaa$c$中的数不与$b$ddd中的数冲突。
然后转移就很方便了。
代码:

#include
using namespace std;inline int read(){
int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans;}const int N=305,mod=998244353;int T,n,m,f[N][N],sum[N][N];inline int calc(int x1,int y1,int x2,int y2){
return sum[x2][y2]+sum[x1-1][y1-1]-sum[x1-1][y2]-sum[x2][y1-1];}inline int solve(){
for(int i=1;i<=n;++i)if(calc(i,i,i,i))return 0; for(int i=n;i;--i){
f[i][i]=1; for(int j=i+1;j<=n;++j){
if(!calc(i,i+1,i,j))(f[i][j]+=f[i+1][j])%=mod; if(!calc(i+1,i,j,i))(f[i][j]+=f[i+1][j])%=mod; for(int m=i+1;m

转载于:https://www.cnblogs.com/ldxcaicai/p/10084829.html

你可能感兴趣的文章
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
深入理解jQuery框架-框架结构
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>