当前位置: 首页 > news >正文

P6333 [COCI2007-2008#1] ZAPIS 题解

首先观察数据范围,一眼 \(\mathcal O(n^3)\),然后再观察题目,你感觉它是个区间 dp,那么恭喜你,你的感觉是对的。

然后你直接一个区间 dp 板子拍上去,设 \(dp_{i, j}\) 表示区间 \([i, j]\) 的方案数,那么转移很显然,若 \(i,j\) 能够匹配,则可以将 \([i + 1, j - 1]\) 包起来,然后计算由两个串拼起来的。

然后你测一下样例,发现你错了。接着你模拟了一下样例,发现你算重了,例如样例 1:()()(),你输出了 2

你发现 \(\texttt{()()()} = \texttt{()} + \texttt{()()}\)\(\texttt{()()} + \texttt{()}\),于是你会统计两遍。也就是对于由两个匹配串拼起来的串,若其中的某一个串也是由某些子串拼起来的,就会算重。

于是你开始寻找原因。设 \(s_{[i,j]} = s_{[i,k_1]} + s_{[k_1+1,j]},s_{[k_1+1,j]}=s_{[k_1+1,k_2]}+s_{[k_2+1,j]}\),其中 \(s_{[i,k_1]},s_{[k_1+1,j]},s_{[k_1+1,k_2]},s_{[k_2+1,j]}\) 都是括号匹配串,那么也一定有 \(s_{[i,j]} = s_{[i,k_2]} + s_{[k_2+1,j]},s_{[i,k_2]}=s_{[i,k_1]}+s_{[k_1+1,k_2]}\),于是 \(s_{[k_1+1, k_2]}\) 就算重了。

然后你开始想办法让它只算一次。可以钦定 \(s_{[k_1+1,k_2]}\) 只在 \(s_{[k_1+1,r]}\) 中出现,那么 \(s_{[i,k]}\) 就一定不是拼接而成的括号串。于是拼接的方式形如"不拼接串+拼接串"。

现在你知道如何去重了,于是你开始修改状态。设 \(dp_{i,j,0/1}\) 表示 \([i,j]\) 不是/是拼接串的方案数。然后你将转移修改。

\[dp_{i,j,0}=check(i, j) \cdot (dp_{i+1,j-1,0}+dp_{i+1,j-1,1}) \\dp_{i,j,1}=\sum_{k=i}^{j-1}{dp_{i,k,0} \cdot (dp_{k+1,j,0}+dp_{k+1,j,1})} \]

其中 \(check(i, j)\) 表示 \(i,j\) 是否能匹配。若 \(s_i = s_j = \texttt{?}\),则 \(check(i, j) = 3\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 505, Mod = 1e5;
int n, dp[N][N][2];
bool f;
string s;
bool check(int i, int j)
{return (s[i] == '(' && s[j] == ')' || s[i] == '[' && s[j] == ']' || s[i] == '{' && s[j] == '}' || (s[i] == '?' && (s[j] == ')' || s[j] == ']' || s[j] == '}') || ((s[i] == '(' || s[i] == '[' || s[i] == '{') && s[j] == '?')));
}
int add(int x, int y)
{if(x + y >= Mod)f = 1;return x + y >= Mod ? x + y - Mod : x + y;
}
signed main()
{cin >> n >> s;s = ' ' + s;for(int i = 1; i < n; i++)if(s[i] == s[i + 1] && s[i] == '?')dp[i][i + 1][0] = 3;else if(check(i, i + 1)) dp[i][i + 1][0] = 1;for(int len = 4; len <= n; len += 2)for(int i = 1; i + len - 1 <= n; i++){int j = i + len - 1;if(s[i] == s[j] && s[i] == '?')dp[i][j][0] = add(dp[i + 1][j - 1][0], dp[i + 1][j - 1][1]) * 3 % Mod;else if(check(i, j))dp[i][j][0] = add(dp[i + 1][j - 1][0], dp[i + 1][j - 1][1]);for(int k = i + 1; k < j; k += 2)dp[i][j][1] = add(dp[i][j][1], dp[i][k][0] * add(dp[k + 1][j][1], dp[k + 1][j][0]) % Mod);}if(f)return printf("%05lld", add(dp[1][n][0], dp[1][n][1])), 0;cout << add(dp[1][n][0], dp[1][n][1]);return 0;
}

P.S:这是我在考场时的心路历程,且我认为大部分人在第一次做此题时都是如此,于是我使用了第二人称。

http://www.zskr.cn/news/20247.html

相关文章:

  • 抖音超人福袋助手,抖音福袋扭蛋机,抖音抢福袋工具,
  • 操作指南:国标GB28181/RTSP推流EasyGBS算法算力平台如何查看设备端录像回看?
  • Codeforces Round 1058 (Div. 2) (4/8)
  • 论文解读-《Learning Discrete Structures for Graph Neural Networks》 - zhang
  • ERP原理笔记
  • 2025 智慧康养实训室/专业建设/虚拟仿真/仿真实训室推荐榜:北京教之道 5 星领衔,适配多元康养场景
  • Wireshark】抓包实战,图文详解TCP三次握手及四次挥手原理
  • 2025 年国内工业水泵厂家最新推荐排行榜:聚焦污水 / 离心 / 渣浆 / 大功率 / 泥浆类设备,助力企业精准选型
  • 基于深度学习的图像增强-zeros-DCE模型源码分享
  • LLVM 后端支持 RISCV 矩阵扩展都有哪些方式
  • 详细介绍:PPT auto Crorrector
  • 2025 年最新推荐!泳池除湿热泵厂家推荐榜单重磅发布,全方位解析优质厂家实力助您选对设备双模式/多功能/三集一体/全直流变频/室内/变频式泳池除湿热泵厂家推荐
  • django template filter safe escapejs json_script等
  • 2025年GEO(AI搜索优化)厂家口碑推荐排行榜
  • 2025年GEO(AI搜索优化)厂家口碑推荐榜:云视有客科技领跑行业创新
  • 【触想智能】工业安卓一体机在人工智能领域上的市场应用分析
  • 基于 PyTorch 完全从零手搓 GPT 混合专家 (MOE) 对话模型 - 详解
  • Linux环境下安装Jenkins2.346.3
  • 2025 年疲劳试验机厂家最新推荐排行榜:涵盖液压 / 电动 / 扭转等多类型设备,助力企业精准挑选优质厂家
  • 2025年GEO(AI搜索优化)源头厂家权威推荐榜单:云视有客科技领跑行业
  • 深入解析:云服务器磁盘空间管理:binlog导致磁盘快速增长的应对策略与自动化实践
  • 第三届大数据与数据挖掘国际会议(IEEE BDDM 2025)
  • 基于MATLAB的波导杆超声波传播仿真程序集设计与实现
  • for 循环中range的部分
  • 国产软件项目管理革命:Gitee PPM如何重塑开发效率
  • 集成开发工具 IDEA下载
  • 数据流图和uml九张图 - f
  • 2025.10.13+7
  • 2025年10月舒适轮胎厂家最新推荐排行榜,静音轮胎,耐磨轮胎,节能轮胎,高性能轮胎公司推荐!
  • 完整教程:【Linux】Linux下的静态链接的底层逻辑