组合数学+费用背包+刷表,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 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾。如果一个对象没有任何指针对其引用,它就是垃圾。 弊端:如果…...
使用Docker部署Qwen3-TTS语音生成服务
使用Docker部署Qwen3-TTS语音生成服务 1. 引言 语音合成技术正在改变我们与机器交互的方式,而Qwen3-TTS作为开源领域的佼佼者,提供了高质量的语音生成能力。传统的部署方式往往需要复杂的环境配置和依赖安装,这让很多开发者望而却步。 Doc…...
PCIe Gen4眼图测试实战:如何用示波器快速定位信号完整性问题(附避坑指南)
PCIe Gen4眼图测试实战:示波器操作与信号完整性诊断全解析 当PCIe Gen4的信号速率突破16GT/s大关时,硬件工程师的工作台上总少不了一台高性能示波器。记得去年参与某企业级SSD项目时,我们团队连续三周被一个诡异的眼图闭合问题困扰——每次系…...
OpenClaw飞书机器人:GLM-4.7-Flash实现智能问答助手
OpenClaw飞书机器人:GLM-4.7-Flash实现智能问答助手 1. 为什么选择OpenClaw飞书GLM组合 去年我接手了一个技术文档整理项目,每天需要处理上百条来自不同渠道的技术咨询。手动回复效率低下,而公有云上的智能客服方案又存在数据安全顾虑。直到…...
缺口大!平均月薪超2万元!这个岗位超级火!
当下最火的是什么?答案毫无悬念,一定是人工智能。如今,人工智能行业正以肉眼可见的速度迅速崛起,市场对相关专业人才的需求也随之越来越大。1.市场人才缺口大前几天,人民日报、央视财经等多个主流媒体发布文章…...
国标GB28181视频监控平台EasyCVR破解偏远地区监控难题的应用实践
在数字化治理全面推进的当下,视频监控系统已然成为保障公共安全、提升基层管理效率的核心基础设施。但对于地形复杂、网络基础薄弱、设备条件参差不齐的偏远地区来说,传统视频监控方案部署面临重重困境,面对地理环境与技术条件的双重限制&…...
清音刻墨Qwen3智能字幕对齐:开箱即用的字幕生成工具
清音刻墨Qwen3智能字幕对齐:开箱即用的字幕生成工具 1. 引言:字幕对齐的痛点与解决方案 在视频制作和内容创作领域,字幕同步一直是个令人头疼的问题。传统字幕制作通常需要经历以下繁琐步骤: 人工听写语音内容手动分割时间轴反…...
Rust的trait对象大小与动态分发在虚函数表实现上的差异
Rust作为一门现代系统编程语言,其独特的trait对象和动态分发机制在性能与灵活性之间取得了巧妙平衡。与C等语言的虚函数表实现相比,Rust的trait对象在内存布局和分发逻辑上展现出显著差异,这些差异直接影响着程序的内存使用效率和运行时行为。…...
选型指南:74HC14、74LVC14、CD40106...这么多施密特非门,你的项目到底该用哪一款?
施密特触发器选型实战:从74HC14到CD40106的工程决策指南 在数字电路设计中,施密特触发器就像一位经验丰富的守门员,能够有效过滤信号噪声并确保数字系统的稳定运行。但当你打开元器件采购平台,面对74HC14、74LVC14、CD40106等数十…...
SEO_从零开始,手把手教你制定SEO优化方案(216 )
SEO:从零开始,手把手教你制定SEO优化方案 在当今互联网时代,搜索引擎优化(SEO)已经成为任何网站希望获得高流量和高曝光的关键。对于新手来说,SEO可能看起来复杂且充满谜团。本文将从零开始,手把手教你如何…...
WinUtil终极指南:10分钟掌握Windows系统管理与优化工具
WinUtil终极指南:10分钟掌握Windows系统管理与优化工具 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil WinUtil是一款强大的Windo…...


