c语言鸽巢原理,Codeforces 1188C DP 鸽巢原理
题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少?
思路:(官方题解)我们先解决这个问题的子问题:我们可以求出beauty值大于等于给你值的序列有多少个(假设为p[i]),那么其实答案就是∑(i从1到max(a)) p[i]。怎么求p数组呢?我们先对数组排序,假设现在求p[x], 设dp[i][j]为以第i个元素为结尾,长度为j的子序列的个数。那么所有a[i] - a[j] >= x的j都可以向i转移,所以,我们用指针维护满足a[i] - a[j] >= x的最靠近i的位置,并且维护前缀和以进行O(1)转移。这样每次的转移是O(n * k)的。假设m = max(a), 那么总的复杂度是O(m * n * k)。但是,我们发现,长度为k的序列有k - 1个差,那么beauty值的最小值为n / (k - 1) (由鸽巢原理可知), 所以复杂度变成了O(m / (k - 1) * n * k) = O(n * m)的,可以过。这个题需要注意一下,如果把dp的两维交换一下,即dp[i][j]表示长度为i的子序列中,以元素j为结尾的子序列的个数,这样表示可以快大概600ms。如果学过《深入理解计算机系统》可能会知道为什么,因为n >= k, 所以访问n的机会多,放第二维会让n的访问之间连续,时间更短。这题可能有点卡long long。
代码:
#include
#define LL long long
#define INF 0x3f3f3f3f
#define pii pair
#define db double
using namespace std;
const LL mod = 998244353;
const int maxn = 1010;
int dp[maxn][maxn];
int sum[maxn][maxn];
int a[maxn];
int ans = 0;
int n, k;
void solve(int x) {
for (int i = 0; i <= k; i++)
for (int j = 1; j <= n; j++) {
dp[i][j] = 0;
sum[i][j] = 0;
}
for (int i = 1; i <= n; i++) dp[1][i] = 1;
for (int i = 1; i <= k; i++) {
int l = 1;
for (int j = 1; j <= n; j++) {
while(a[j] - a[l] >= x) l++;
dp[i][j] = (dp[i][j] + sum[i - 1][l - 1]) % mod;
sum[i][j] = (dp[i][j] + sum[i][j - 1]) % mod;
}
}
for (int i = 1; i <= n; i++)
ans = (ans + dp[k][i]) % mod;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= a[n] / (k - 1); i++) {
solve(i);
}
printf("%d\n", ans);
}
标签:1188C,int,sum,Codeforces,long,maxn,DP,序列,dp
来源: https://www.cnblogs.com/pkgunboat/p/11144087.html
c语言鸽巢原理,Codeforces 1188C DP 鸽巢原理相关推荐
- Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)
Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理.倒排索.建立查找树.处理Hash冲突.Hash查找) 目录 一.SimHash算法 1.SimHash算法五个步骤 2. ...
- java语言的实现机制_JAVA语言之Java NIO的工作机制和实现原理介绍
本文主要向大家介绍了JAVA语言之Java NIO的工作机制和实现原理介绍,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 前言 本文只简单介绍NIO的原理实现和基本工作流程 I/O和 ...
- [codeforces 1359A] Berland Poker 抽屉原理
Educational Codeforces Round 88 (Rated for Div. 2) 参赛人数19992 [codeforces 1359A] Berland Poker ...
- stc15系列c语言pwm编程,STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现.docx...
STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现 STC单片机增强型PWM发生器原理及应用主 讲:何宾Email:hebin@mail.buct.edu.cn2016.03增强 ...
- aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:FeelsChaotic juejin.im/post/5c57b2d5e51d45 ...
- java原理教程,java基础之运行原理(一),java基础运行原理
java基础之运行原理(一),java基础运行原理 java的核心配置:JDK JDK主要包括三个部分 1.Jre:java的运行环境 2.Java的工具:java的编译器(java.c.exe). ...
- 分类计数原理与分步计数原理_《分类加法计数原理与分步乘法计数原理》教学设计...
一.本节课教学内容的本质.地位.作用分析 分类加法计数原理与分步乘法计数原理是人类在大量的实践经验的基础上归纳出的基本规律,它们不仅是推导排列数.组合数计算公式的依据,而且其基本思想方法也贯穿在解决本 ...
- 计算机数控机床的原理,数控机床5计算机数控装置原理.ppt
文档介绍: C装置的功能和特点计算机数控装置是数控机床的核心.它是借助于微机结合必要的硬件构成的装置.这种数控装置替代了早期的纯硬件式数控装置.以前,我们称数控装置为MNC,C,即ComputerNu ...
- HwBinder原理总结-Android10.0 HwBinder通信原理(十一)
摘要:本节主要来进行Android10.0 HwBinder的原理总结 阅读本文大约需要花费14分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设 ...
最新文章
- Android screencap截屏指令
- 初等数学O 集合论基础 第一节 集合及其基本运算、de Moivre公式
- 【OpenCV】函数imread的使用之通道数变化
- error: a label can only be part of a statement and a declaration is not a statement
- vim循环下表复制_Vim求生手册,让你离“Vim党”更近一步!
- String类型的字符长度(码点/代码单元的区别)
- arcgis伪节点检查_arcgis建立拓扑分析(检验矢量图)
- 使用Matplotlib Numpy Pandas构想泰坦尼克号高潮
- 我的世界服务器虚拟菜单插件,《我的世界》服务器快捷菜单插件怎么用?
- c 语言编译器 论文,毕业论文--C语言编译器设计与实现.doc
- Docker入门 三 用服务来扩展和负载均衡你的应用
- mysql自定义函数to_date_mysql 之 str_to_date ()函数 和date_format()函数
- hd Aruba wifi / honor
- 在oracle包体中动态创建表 PKG
- 如何制作网络视频投票?
- 2022-2028年中国医用纺织品行业市场发展潜力及投资风险预测报告
- 塑胶模具设计之冷却系统
- 通过高德api获取经纬度
- Harmonious Graph(并查集)
- ADF 单位根检验 Dickey-Fuller 迪基-福勒检验