【题解】Beautiful Bracket Sequence (easy version)

在这里插入图片描述
分析:
在这里插入图片描述
在这里插入图片描述

本题妙就妙在没有直接计算每种深度,而是逐层扩展,考虑新增括号的方案贡献。因为假如外面有一层括号,那么所有区间内方案的深度都要加1,这个贡献是可以算的。

//Interval DP #include<bits/stdc++.h> #define int long long using namespace std; const int N=2005; const int mod=998244353; int n,dp[N][N],g[N]; char s[N]; int kpow(int x,int y) { int tot=1; for(;y;y>>=1) { if(y&1) tot=(tot*x)%mod; x=(x*x)%mod; } return tot; } signed main() { scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++) { if(s[i]=='?') g[i]=g[i-1]+1; else g[i]=g[i-1]; } for(int len=2;len<=n;len++) { for(int i=1;i<=n-len+1;i++) { int j=i+len-1; if(s[i]=='('&&s[j]==')') dp[i][j]=dp[i+1][j-1]+kpow(2,g[j-1]-g[i]); if(s[i]=='('&&s[j]=='(') dp[i][j]=dp[i][j-1]; if(s[i]==')'&&s[j]=='(') dp[i][j]=dp[i+1][j-1]; if(s[i]==')'&&s[j]==')') dp[i][j]=dp[i+1][j]; if(s[i]==')'&&s[j]=='?') dp[i][j]=dp[i+1][j]; if(s[i]=='('&&s[j]=='?') dp[i][j]=dp[i+1][j-1]+kpow(2,g[j-1]-g[i])+dp[i][j-1]; if(s[i]=='?'&&s[j]=='(') dp[i][j]=dp[i][j-1]; if(s[i]=='?'&&s[j]==')') dp[i][j]=dp[i+1][j-1]+kpow(2,g[j-1]-g[i])+dp[i+1][j]; if(s[i]=='?'&&s[j]=='?') dp[i][j]=dp[i+1][j-1]+kpow(2,g[j-1]-g[i])+dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]; dp[i][j]%=mod; //printf("dp[%d][%d]=%d\n",i,j,dp[i][j]); } } printf("%lld",dp[1][n]); }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530395.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(6)  评论(0编辑  收藏  举报  
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示