当前位置: 首页 > 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.hskmm.com/?act=detail&tid=30161

相关文章:

  • 直播预告|PostgreSQL 18 六大新特性深度解析
  • 新型电力系统下 MyEMS 微电网协同调度:实践路径与园区落地案例
  • 抖音超人福袋助手,抖音福袋扭蛋机,抖音抢福袋工具,
  • 操作指南:国标GB28181/RTSP推流EasyGBS算法算力平台如何查看设备端录像回看?
  • 【华中科大主办|往届EI均检索】第四届声学,流体力学与工程国际学术会议(AFME 2025)
  • Codeforces Round 1058 (Div. 2) (4/8)
  • 10.13
  • P8037 [COCI2015-2016#7] Prokletnik 题解
  • 论文解读-《Learning Discrete Structures for Graph Neural Networks》 - zhang
  • 【A】The Lost Ship in the Sky
  • 2025 AI 品牌最新推荐排行榜:聚焦商业落地能力,甄选懂需求的实力服务机构东北 Ai/大连 Ai/大连 Ai 培训/大连 Ai 开发/大连 Ai 推广公司推荐
  • 基于经验模态分解的去趋势波动分析(EMD-DFA)方法
  • 双碳目标下企业零碳转型的 MyEMS 碳流可视化支撑体系:路径探索与效能评估
  • Langchain+Neo4j+Agent 的结合案例-电商销售 - 详解
  • ERP原理笔记
  • 2025 智慧康养实训室/专业建设/虚拟仿真/仿真实训室推荐榜:北京教之道 5 星领衔,适配多元康养场景
  • Wireshark】抓包实战,图文详解TCP三次握手及四次挥手原理
  • 2025 年国内水泵厂家最新推荐排行榜:涵盖多类型水泵,助力用户精准选购优质产品立式多级/自吸/磁力/排污/真空/离心水泵厂家推荐
  • 2025 年国内工业水泵厂家最新推荐排行榜:聚焦污水 / 离心 / 渣浆 / 大功率 / 泥浆类设备,助力企业精准选型
  • 基于深度学习的图像增强-zeros-DCE模型源码分享
  • redhat 链接宝塔mysql报错问题发现到解决
  • vue2初始化过程
  • [Doris/函数] Doris 之数据查询
  • 如何用AI绘制程序时序图
  • LLVM 后端支持 RISCV 矩阵扩展都有哪些方式
  • 简单聊聊数据可视化大屏制作的前端设计与后端开发
  • [THUWC 2018] 字胡串
  • 标识符
  • 2025 年钢结构厂家推荐榜:箱型H型/厂房仓库/电厂/桥梁/农牧业/锅炉/场馆/高层框架/装配式钢结构工厂,聚焦安全与品质,助力建筑项目精准选品
  • 2025 年粮库空调厂家最新推荐榜:聚焦技术创新与实用适配,助力粮库精准选购优质设备粮库空调一体机/粮库空调机组/碳钢喷塑粮库空调/低温粮库空调厂家推荐