[NOIP 2024 模拟2]数组操作

news/2024/9/18 0:40:19/文章来源:https://www.cnblogs.com/maniubi/p/18410934

[NOIP 2024 模拟2]数组操作

题意

\(n + 2\) 个整数 \(a_0, a_1, . . . , a_n, a_{n+1}\)\(a_0 = a_{n+1} = 0\)。你需要做确切地 \(n\) 次操作,每次数组操作为以下形式: 选择一个整数 \(x\) 满足 \(a_x \ne 0\),使得 \(a_x = 0\),令 \(l=\max_{i<x,a_i=0} i,r=\min_{i>x,a_i=0} i\),此次操作的花费为 $\max(a_l, a_{l+1}+, . . . , a_{x−1}) + \max(a_{x+1}. . . , a_{r−1}, a_r) $牛币。 有多少不同的操作方式使得操作花费的牛币最少,两种操作不同当且仅当两种操 作的操作序列不同。 答案对 \(998244353\) 取模。

思路

发现把一个位置变成 \(0\) 后左右两部分就没有关系了,可以使用区间 dp。

定义 \(f_{i,j}\) 表示操作区间 \([i,j]\) 的最小代价,\(g_{i,j}\) 表示操作区间 \([i,j]\) 代价最小的方案数。

\(f_{i,j} = \min(f_{i,k-1}+f_{k+1,j}+\max_{i\le t<k}a_t+\max_{k< t\le j} a_t)\)

\(g_{i,j}=\sum_{k\rightarrow (i,j)} g_{i,k-1}\times g_{k+1,j} \times C_{j-i}^{k-i}\)

第一个转移方程显然。第二个转移方程的 \(C_{j-i}^{k-i}\) 表示这个区间还剩下 \(j-i\) 个操作(按顺序),分 \(k-i\) 个给左边,剩下的给右边,所以 \(C_{j-i}^{j-k}\) 也正确。可能会有疑问,只确定了哪些操作给左边,哪些操作给右边,但内部的顺序没有确定啊?实际上,虽然区间 dp 是从小区间合并成大区间,但实际操作时是从大区间分成小区间,这里只用确定哪些分给左边,哪些分给右边,它们内部的顺序它们自己分的时候会确定好。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 998244353;
const int N = 2e3 + 5;
int n, a[N], pre[N], suf[N];
ll cnt[N][N], dp[N][N], c[N][N];
void solve() {cin >> n;for (int i = 1; i <= n; i ++) cin >> a[i];c[0][0] = 1;for (int i = 1; i <= n; i ++) {c[i][0] = 1;for (int j = 1; j <= n; j ++) {c[i][j] = c[i - 1][j] + c[i - 1][j - 1];c[i][j] %= mod;}}for (int i = 0; i <= n + 1; i ++) for (int j = 0; j <= n + 1; j ++) cnt[i][j] = 1;for (int k = 1; k <= n; k ++) {for (int i = 1; i <= n; i ++) {int j = i + k - 1;if (j > n) break;pre[i - 1] = 0, suf[j + 1] = 0;for (int t = i; t <= j; t ++) pre[t] = max(pre[t - 1], a[t]);for (int t = j; t >= i; t --) suf[t] = max(suf[t + 1], a[t]);dp[i][j] = 1e9, cnt[i][j] = 0;for (int t = i; t <= j; t ++) dp[i][j] = min(dp[i][j], dp[i][t - 1] + dp[t + 1][j] + pre[t - 1] + suf[t + 1]);for (int t = i; t <= j; t ++) if (dp[i][t - 1] + dp[t + 1][j] + pre[t - 1] + suf[t + 1] == dp[i][j]) cnt[i][j] += cnt[i][t - 1] * cnt[t + 1][j] % mod * c[j - i][j - t] % mod, cnt[i][j] %= mod;}}cout << cnt[1][n] << "\n";
}
signed main() {freopen("arr.in", "r", stdin);freopen("arr.out", "w", stdout);int Case = 1;
//	cin >> Case;while (Case --)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796186.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure Service Bus】批量处理Service Bus Topic 中的死信消息(dead-lettered messages)

问题描述 在Azure的门户页面上,因为Service Bus Topic中有很多dead-lettered message,而这些消息占用了大量的存储空间,通过门户上的Service Bus Explorer每次只能消费一条消息。 虽然可以通过修改代码来指定消费私信队列中消息,但是需要修改代码,需要一些工作量。 有没有…

Transformer两大发展方向——GPT系列及BERT(一)

前面介绍了Transformer,随着其发展在NLP领域应用越来越多,在其基础上主要有两篇影响非常大的文章,一篇是GPT,另一篇是BERT。OpenAI提出的GPT采用Transformer解码器结构,一路更新迭代到了现在有了GPT-4,而Google提出的BERT采用Transformer的编码器结构。大体时间线如下图所…

RustPython简单使用

RustPython介绍 同CPython,Jpython,PyPy一样,RustPython,是使用Rust语言实现的Python解释器,支持Python3语法。 项目地址:https://github.com/RustPython/RustPython RustPython真正方便的是可以编译成Wasm文件,可以直接在浏览器中使用,示例网站:https://rustpython.g…

【解题报告】P8478 「GLR-R3」清明

我无可代替,哪怕来历已不神秘;麦克风接力,百万人就等我出席。P8478 「GLR-R3」清明 参考了出题人题解和 xcyyyyyy 大神的题解,强推前两篇。 拿到题完全没思路怎么办??? 人类智慧的巅峰,思维量的登峰造极。 换句话说就是非人题目,不过不得不说 GLR 的题是真的好,难度也…

Openwrt安装ddns-go

必备条件已刷好OpenWRT的路由 Openwrt已配置好网络根据CPU架构下载DDNS-go 我用的是迅雷赚钱宝1代,其CPU是arm7,所以要下载对应的arm7版本 https://github.com/jeessy2/ddns-go/releases 解压文件,将文件复制到openwrt 用WinSCP连接OpenWRT,复制ddns-go进去 WinSCP下载 如果…

python如何使用 秘钥证书 进行 SM2 加密

最近一个项目,需要使用sm2非对称加密,对方直接给的秘钥证书,python使用gmssl 进行加密,解密,加签,验签用的秘钥是这种格式 # Private Key秘钥 5aa03412c3051e1d4cf9d19cfbeeec70c28f388c9f82747cc912096c9cd44bea # Public Key 公钥 044291b381a039a8d7d02d7272d2d7c78a30d33e…

让小爱音箱播放电脑/NAS上歌曲,支持自动从哔哩哔哩/油管下载歌曲,无需刷机。支持语音控制和WebUI控制,docker部署多平台兼容,解决仅能播放试听版的苦恼

小米AI音箱很多人都有,但使用中播放歌曲时总是提示仅能播放试听版,不能完整听歌,很烦人。今天介绍的方法就是要彻底解决这个问题,实现让小爱AI音箱能够播放本地歌曲,本地没有的歌曲还能自动从网上搜索下载的功能。 已测试支持的设备:型号 名称L06A 小爱音箱L07A Redmi小爱…

Linux系统搭建性能测试监控体系

一.安装Grafana 1.Grafana介绍: Grafana是一个开源的监控和可视化工具,用于显示和跟踪各种指标,数据和日志,支持多种源,包括influxDB、prometheus、mango DB,Redis,Mysql,PostgreSQL等。它提供多种图标类型,饼图,支持设置预警机制,当监控指标超出预定阈值时,可以通过em…

公胶壳和母胶壳

公胶壳和母胶壳 在电子连接器领域,"公胶壳"和"母胶壳"是两种常见的术语,它们通常用来描述连接器的性别,即插头和插座。公胶壳:通常指的是连接器的阳性部分,也就是带有突出的针脚或插销的部分。这些针脚可以插入母胶壳中的相应孔洞,以完成电路的连接。…

2024秋软件工程个人作业(第二次)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 要求使用Python编写一个“羊了个羊”风格的消除类小游戏。对开发过程进行实践,更加熟悉aigc工具学号 102202135…

PbootCMS网站apache伪静态规则

<IfModule mod_rewrite.c>Options +FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?p=$1 [QSA,PT,L]</IfModule>扫码添加技术【解决问题】专注中小企业网站建设、网站安全1…

PbootCMS网站nginx伪静态规则

nginx #请复制下面伪静态配置到nginx配置文件中: #规则适合PbootCMS V2.0+版本location / {if (!-e $request_filename){rewrite ^/(.*)$ /index.php?p=$1 last;} }扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、J…