组合数学+费用背包+刷表,G2 - Playlist for Polycarp (hard version)
目录
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
2、复杂度
3、代码详解
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
| G2 - Playlist for Polycarp (hard version) |
二、解题报告
1、思路分析
一眼dp,但是这个dp思路和代码都不太好想
首先是涉及到组合数学的分配问题
方案数怎么求?
既涉及到了相邻的顺序,又涉及到了容量/费用
我们可以单独考虑然后相乘:
f(i, j, k, x) 为 选取 i 个类型1,j个 类型2,k 个类型3,并且以类型x结尾,且无相同相邻项的方案数
这个dp可太简单了,O(1)转移,O(N^3 * 3)的方案数,很好搞定
再考虑 g(i, j, k, t) 即 选 i 个类型1,j个 类型2,k 个类型3,总费用为t(费用指的是时间和)的方案数
这是个费用背包问题,我们直接求是O(N ^ 4 T),太大了
考虑转换一下,g(j, k, p) 为 j个 类型2,k 个类型3 总费用为t方案数,h(i, T - p)为i个类型1,总费用为t的方案数,乘法原理二者相乘可得
然后 (f(i, j, k, 0) + f(i, j, k, 1) f(i, j, k, 2)) * g(j, k, p) * h(i, T - p) * fac(i) * fac(j) * fac(k) 就是一组方案数
什么意思?
f 确定了每个类型放的位置,然后每个类型的每个物品是不同的,这就是一个多重集排列问题
然后 h 和 t 又确定了选取哪些类型1、2、3,再根据乘法原理乘一块就是答案
2、复杂度
时间复杂度: O(N^3 T)空间复杂度:O(N^ T)
3、代码详解
#include <bits/stdc++.h>
#define sc scanf
using i64 = long long;
using PII = std::pair<int, int>;
constexpr int N = 55, M = 2505, P = 1'000'000'007;void add(int& x, int y) { x += y, (x >= P) && (x -= P); }
int fac[N], f[N][N / 2][N / 3][3], g[N / 2][N / 3][M], h[N][M];void solve() {int n, T;std::cin >> n >> T;fac[0] = 1;for (int i = 1; i <= n; ++ i) fac[i] = 1LL * i * fac[i - 1] % P;std::vector<int> a, b, c;std::vector<std::array<int, 3>> cnt(n);for (int i = 0, t, g; i < n; ++ i) {std::cin >> t >> g;if (g == 1) a.push_back(t);if (g == 2) b.push_back(t);if (g == 3) c.push_back(t);}if (a.size() < b.size())std::swap(a, b);if (a.size() < c.size()) std::swap(a, c);if (b.size() < c.size())std::swap(b, c);int A = a.size(), B = b.size(), C = c.size();// 求费用背包g[0][0][0] = 1;for (int i = 0; i < B; ++ i) for (int j = i; ~j; -- j) for (int p = T - b[i]; p >= 0; -- p)add(g[j + 1][0][p + b[i]], g[j][0][p]);for (int i = 0; i < C; ++ i)for (int j = B; j >= 0; -- j)for (int k = i; k >= 0; -- k)for (int p = T - c[i]; p >= 0; -- p) add(g[j][k + 1][p + c[i]], g[j][k][p]);h[0][0] = 1;for (int i = 0; i < A; ++ i) for (int j = i; ~j; -- j) for (int p = T - a[i]; p >= 0; -- p) add(h[j + 1][p + a[i]], h[j][p]);// 刷表f[1][0][0][0] = f[0][1][0][1] = f[0][0][1][2] = 1;for (int i = 0; i <= A; ++ i)for (int j = 0; j <= B; ++ j)for (int k = 0; k <= C; ++ k) {for (int x = 0, v; x < 3; ++ x) {if (v = f[i][j][k][x]) {if (x) add(f[i + 1][j][k][0], v);if (x ^ 1) add(f[i][j + 1][k][1], v);if (x ^ 2) add(f[i][j][k + 1][2], v);}}add(f[i][j][k][0], f[i][j][k][1]);add(f[i][j][k][0], f[i][j][k][2]);f[i][j][k][0] = 1LL * f[i][j][k][0] * fac[i] % P * fac[j] % P * fac[k] % P;}int res = 0;for (int j = 0; j <= B; ++ j)for (int k = 0; k <= C; ++ k)for (int p = 0; p <= T; ++ p)if (g[j][k][p])for (int i = 0; i <= A; ++ i)if (h[i][T - p])add(res, 1LL * f[i][j][k][0] * g[j][k][p] % P * h[i][T - p] % P);std::cout << res;
}int main() {#ifdef DEBUGfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifstd::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);int _ = 1;// std::cin >> _;while (_ --)solve();return 0;
}
相关文章:
组合数学+费用背包+刷表,G2 - Playlist for Polycarp (hard version)
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 G2 - Playlist for Polycarp (hard version) 二、解题报告 1、思路分析 一…...
阿尔泰科技利用485模块搭建自动灌溉系统实现远程控制
自动灌溉系统又叫土壤墒情监控系统,土壤墒情监控系统主要实现固定站无人值守情况下的土壤墒情数据的自动采集和无线传输,数据在监控中心自动接收入库;可以实现24小时连续在线监控并将监控数据通过有线、无线等传输方式实时传输到监控中心生成…...
Python正则表达式中的分组
表达式中的分组 它是可以通过" () “来进行分组,更专业的表达就是捕获组,每个完整的” () “可以分为一组,同时,” () “中还可以嵌套” () ",即组之间还可以存在更小的组 概念 1、当我们在一个正则表达式…...
openstack设置IP直接登录,不需要加dashboard后缀
openstack 实验环境,openstack-t版,centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…...
PHP宠物店萌宠小程序系统源码
🐾萌宠生活新方式🐾 🏡【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店?现在,“宠物店萌宠小程序”就是你的秘密花园!🌟只需轻轻一点,就能瞬…...
nginx负载均衡实例
实现效果 浏览器输入地址http://nginx服务器ip(:80)/edu/a.html,实现负债均衡效果,平均分配到 服务器ip:8080和 服务器ip:8081进程中。 准备工作 准备两个tomcat,一个监听在8080端口,一个监听在8081端口。也可以准备多个tomcat。…...
正则表达式在Python中的高级应用:从HTML中提取数据
正则表达式在Python中的高级应用:从HTML中提取数据 作为一名资深的Python程序员,我深知正则表达式在文本处理中的重要性。尤其是在处理HTML文档时,正则表达式可以成为我们提取数据的强大工具。在本文中,我将通过一个实际的例子&a…...
docker compose 部署交互模式的容器-以Ubuntu为例
docker compose 部署交互模式的容器-以Ubuntu为例 问题介绍解决方式 同步发布在个人笔记docker compose 部署交互模式的容器-以Ubuntu为例 问题介绍 想通过 docker compose 方式部署一个交互模式的 Ubuntu 容器,但是以平常的方式执行部署后,发现容器被创…...
display: flex 和 justify-content: center 强大居中
你还在为居中而烦恼吗,水平居中多个元素、创建响应式布局、垂直和水平同时居中内容。它,display: flex 和 justify-content: center 都可以完成! display: flex:将元素定义为flex容器 justify-content:定义项目在主轴…...
记录贴-idea导入别人的项目
链接: IDEA导入Web项目的三种方式 链接: idea怎么导入别人的maven项目 链接: IDEA 如何导入别人的javaweb项目进行部署...
算法第九天:leetcode59.螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:n 1 输出&am…...
androidkiller重编译apk失败的问题
androidkiller重编译apk失败 参考: https://blog.csdn.net/qq_38393271/article/details/127057187 https://blog.csdn.net/hkz0704/article/details/132855098 已解决:“apktool” W: invalid resource directory name:XXX\res navigation 关键是编译…...
matlab中plot的一些用法
文章目录 一、基本用法二、绘制多个数据集三、设置线型、颜色四、添加标题和标签五、添加图例六、设置轴范围七、绘制网格八、 在同一图中绘制多个子图九、绘制带误差条的图十、绘制半对数图和对数图十一、绘制填充区域图十二、综合案例 一、基本用法 x 0:0.1:10; y sin(x);…...
Elasticsearch:Retrievers 介绍 - Python Jupyter notebook
在今天的文章里,我是继上一篇文章 “Elasticsearch:介绍 retrievers - 搜索一切事物” 来使用一个可以在本地设置的 Elasticsearch 集群来展示 Retrievers 的使用。在本篇文章中,你将学到如下的内容: 从 Kaggle 下载 IMDB 数据集…...
5 webSocket
webSockets 简介 什么是 websocket webSockets 是一种先进的技术;它可以在用户的浏览器和服务器之间打开交互式通信会话;使用此 API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应 websocket 是一种网络通信协议,是HTML5开始提供的一种在单…...
PD芯片诱骗取电电压给后端小家电用电:LDR6328
在智能家居浪潮的推动下,小家电作为日常生活中不可或缺的一部分,其供电方式的创新与优化正逐步成为行业关注的焦点。随着快充技术的普及,特别是Power Delivery(PD)协议的广泛应用,一种新型供电模式——利用…...
深入解析Linux文件权限管理:掌握`chmod`和`chown`命令
深入解析Linux文件权限管理:掌握chmod和chown命令 深入解析Linux文件权限管理:掌握chmod和chown命令 大纲:摘要:内容: 1. 引言2. 理解文件权限3. 使用chmod命令4. 使用chown命令5. 综合应用6. 常见问题与解决方案7. 结…...
3.Implementing Controllers
Implementing Controllers 控制器提供了对应用程序行为的访问,这些行为通常通过一个服务接口来定义。控制器解释用户输入,并将其转换为由视图展示给用户的模型。Spring 以非常抽象的方式实现了控制器,使得你能够创建各种各样的控制器。 Spr…...
如何分清楚常见的 Git 分支管理策略Git Flow、GitHub Flow 和 GitLab Flow
Git Flow、GitHub Flow 和 GitLab Flow 是几种常见的 Git 分支管理策略,它们帮助开发团队更高效地管理代码库和协同开发。 Git Flow Git Flow 是一种功能强大的分支管理模型,由 Vincent Driessen 提出,适用于发布周期较长、需要严格管理发布…...
Java垃圾收集器选择与优化策略
1.垃圾收集算法有哪些,可以聊一下吗? 如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾。 1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾。如果一个对象没有任何指针对其引用,它就是垃圾。 弊端:如果…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...


