XYD1004CSPS

news/2024/10/9 12:21:58/文章来源:https://www.cnblogs.com/chenwenmo/p/18453950

T1 序列 [贪心,模拟]

Description

给定一个序列,每次可以将一个数减一,求让所有数字互不相同的最小操作数,\(0\) 除外,也就是 \(0\) 可以相同。

Solution

贪心地,从大到小考虑每个数,都只需要减到第一个没有数出现的数。
开个桶从大到小累计答案即可。

T2 XYD [构造]

Description

给定 \(n\),构造一个长度不超过 \(6000\) 且仅含 X Y D 三个字母的字符串,使得子序列 XYD 恰好出现 \(n\) 次。

Solution

对于每个 X,假设后面有 \(k\) 个 YD,那么它们产生的贡献是 \(\sum_{i=1}^k i\)
于是我们可以把 \(n\) 拆成许多个数的阶加即可。
可以选择最大到 \(2000\) 的阶加,如果过大那么字符串长度可能超过 \(6000\)

T3 大 [状压DP]

Description

初始序列 x 和 y,有 \(m\) 个操作序列 a,每次操作可以把 x 每一个元素变为 \(\max(x_i,a_i)\) 或对 y 进行同样操作。
最大化 \(\sum \max(x_i,y_i)\)

Solution

考虑每一位,假设它的操作是独立的,那么我们肯定贪心地每一位选最大的是最优的。
但是一个序列只能对 x 和 y 其中一个操作,不能同时操作两个,所以这便涉及到最优分配。
为了方便处理,我们可以把取最大值的操作转换为赋值操作,也就是取一堆最大值,相当于把一个最大的直接赋值给它,考虑哪些位上被赋值,哪些位保留。
综上,要考虑到赋值哪些位,还要考虑到赋值给 x 或 y,于是我们选择 dp 求解。
\(f_x(i,j)\)\((1\le i\le m)\)\((0\le j\le 2^{2n})\) 表示考虑前 \(i\) 个操作序列,现在是第 \(i\) 个,赋值状态为 \(j\),且赋值给 x,所能取到的最大答案。\(f_y(i,j)\) 同理。
显然直接转移状态数是会炸的。
但是,每一位我们只需要考虑前 \((n+1)\) 大的,因为最坏的情况就是,x 想要的都被 y 抢走更优,那么 y 最多能占用 \(n\) 个,\(x\) 选第 \((n+1)\) 个即可。然后又因为一共有 \(n\) 位,所以状态数最多只有 \(O(n(n+1))\)。dp 的复杂度为 \(O(n(n+1)2^{2n})\),非常正确的时间复杂度。
然后空间上,把第一维滚掉即可。
dp 伪代码:

for(int i : 1 ~ m){for(int j : 1 ~ n){if(id[i][j] <= n + 1){ // 每位只考虑前 (n + 1) 个for(int k : 1 ~ 2^2n){if(第 j 位被选了){fx[k] = max(fx[k], fx[k ^ (1 << (j - 1))] + a[i][j]);} }for(int k : 1 ~ 2^2n){if(第 j 位被选了){fy[k] = max(fy[k], fy[k ^ (1 << (j + n - 1))] + a[i][j]);}}}}// 合并答案 滚动数组fx[] = fy[] = max(fx[], fy[]);
}
// 把没赋值的加上原来的值
for(int i : 1 ~ 2^2n){for(int j : 1 ~ n){if(第 j 位没被赋值){fx[i] += x[j];}}for(int j : n+1 ~ 2n){if(第 j 位没被赋值){fx[i] += y[j];}}
}
ans = max{fx[]}; // 用 fy[] 也行,因为已经合并了

Summary

DP 好题,把取 \(\max\) 转化为了赋值,并巧妙利用了题目 \(n\) 的数据范围。

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

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

相关文章

日本语版本在线客服系统

我们系统的前端访客界面支持多语种展示 默认会根据浏览器语言进行自动切换URL聊天链接中传递参数,例如:lang=ja-JP 则界面就展示为日文 界面上的文案部分,是可以通过语种文件进行转换展示,但是内容部分是不会跟着变的所以,建议每一个语种建立一个商家。例如:英文客服,中…

回溯法

算法导论 这个文档是学习“算法设计与分析”课程时做的笔记,文档中包含的内容包括课堂上的一些比较重要的知识、例题以及课后作业的题解。主要的参考资料是 Introduction to algorithms-3rd(Thomas H.)(对应的中文版《算法导论第三版》),除了这本书,还有的参考资料就是 Al…

随机算法

算法导论 这个文档是学习“算法设计与分析”课程时做的笔记,文档中包含的内容包括课堂上的一些比较重要的知识、例题以及课后作业的题解。主要的参考资料是 Introduction to algorithms-3rd(Thomas H.)(对应的中文版《算法导论第三版》),除了这本书,还有的参考资料就是 Al…

分治法

算法导论 这个文档是学习“算法设计与分析”课程时做的笔记,文档中包含的内容包括课堂上的一些比较重要的知识、例题以及课后作业的题解。主要的参考资料是 Introduction to algorithms-3rd(Thomas H.)(对应的中文版《算法导论第三版》),除了这本书,还有的参考资料就是 Al…

贪心法

算法导论 这个文档是学习“算法设计与分析”课程时做的笔记,文档中包含的内容包括课堂上的一些比较重要的知识、例题以及课后作业的题解。主要的参考资料是 Introduction to algorithms-3rd(Thomas H.)(对应的中文版《算法导论第三版》),除了这本书,还有的参考资料就是 Al…

Nuxt.js 应用中的 page:finish 钩子详解

title: Nuxt.js 应用中的 page:finish 钩子详解 date: 2024/10/9 updated: 2024/10/9 author: cmdragon excerpt: page:finish 是 Nuxt.js 中用于处理页面加载完成事件的钩子,特别是与 Suspense机制相关。这个钩子允许开发者在页面加载完成后执行自定义操作,以优化用户体验…

智驾仿真测试实战之自动泊车HiL仿真测试

1.引言汽车进入智能化时代,自动泊车功能已成为标配。在研发测试阶段,实车测试面临测试场景覆盖度不足、效率低下和成本高昂等挑战。为解决这些问题,本文提出一种自动泊车HiL仿真测试系统方案,可大幅度提升测试效率及测试场景覆盖度、缩短测试周期、加速产品迭代升级。2.自动…

直接跳转接入在线客服系统

PC网站或H5网站可以通过多种方式接入客服系统,直接访问或跳转聊天链接,是最简单的一种方式 很多人说,我这里的需求是根据xxxx规则进入某个客服(巴拉巴拉一大堆) 这个是前端自行处理的,你们随意任何规则,最终跳到我们这边指定的聊天连接上就行了 至于你们的规则是什么,我…

如何自己动手实现一个图片解答小助手

本文介绍了如何自己动手实现一个图片解答小助手。有一张图片如下所示:Kimi上有一个功能,就是解析图片内容,给出回答:这样可以用于拍照向AI提问的场景,我自己也有这方面的需求,因此动手实践了一下。 自己动手实现的效果如下所示:那么自己如何实现呢? 可以通过添加一个OC…

轻量虚拟机 multipass

multipass listmultipass info multipass shell 后续就可以 shell了

传奇霸业网页游戏单机版安装教程+GM后台+无需虚拟机

今天给大家带来一款单机游戏的架设:传奇霸业网页游戏。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教…

go抽象封装是一种简化认知的手段

通过 Kubernetes 看 Go 接口设计之道 原创 蔡蔡蔡菜 蔡蔡蔡云原生Go2024年10月01日 08:30 广东解耦依赖底层 在 Kubernetes 中能看到非常多通过接口对具体实现的封装。 Kubelet 实现了非常多复杂的功能,我们可以看到它实现了各种各样的接口,上层代码在使用的时候并不会直接实…