【带限制的完全背包】Educational Codeforces Round 133 (Rated for Div. 2) D. Chip Move

2023-11-04

题意:
给定 n n n k k k,初始步长为 k k k ,每次可以走 k k k 的倍数次步,下一次走 ( k + 1 ) (k+1) (k+1)的倍数次步,以此类推,问从 0 0 0 开始到达 [ 1 , n ] [1,n] [1,n] 每个点的方案数。

题解:
当每次只走一倍的步数时, ( s t e p + k ) × ( s t e p − k + 1 ) 2 ≤ n \frac{(step+k)\times (step-k+1)}{2}\leq n 2(step+k)×(stepk+1)n,所以最多只会走 O ( n ) O(\sqrt{n}) O(n )次。

问题转换为带限制的完全背包问题,走第 i i i 次前,必须已经走了 1 1 1 i − 1 i-1 i1

f [ i ] [ j ] f[i][j] f[i][j] 表示走了 i i i次,第 i i i 次走完后到达点 j j j 的方案数
i i i 次走的步数为 ( k + i − 1 ) (k+i-1) (k+i1) 的倍数

不带限制的完全背包的模板为:

for (int i = 1; i <= n; ++i) f[i] = 0;
f[0] = 1;

for (int step = k; (start = (step + k) * (step - k + 1) / 2) <= n; ++step)
	for (int j = 0; j <= n; ++j)
		if (j >= step) f[i][j] += f[i - 1][j - step];

但是本题的限制为:走第 i i i 次前,必须已经走了 1 1 1 i − 1 i-1 i1
每次需要强制走一下第 i − 1 i-1 i1 次,如下:

for (int i = 1; i <= n; ++i) f[0][i] = 0;
f[0][0] = 1;
for (int step = k; (step + k) * (step - k + 1) / 2 <= n; ++step) {
	for (int j = 0; j <= n; ++j)
		if (j >= step) f[i][j] = f[i - 1][j - step];
		else f[i][j] = 0;
	for (int j = 0; j <= n; ++j)
		if (j >= step) f[i][j] += f[i - 1][j - step];
	for (int j = 1; j <= n; ++j) ans[j] += f[j];
}

滚动数组优化一下:

for (int i = 1; i <= n; ++i) f[i] = 0;
f[0] = 1;

for (int step = k; (step + k) * (step - k + 1) / 2 <= n; ++step) {
	for (int j = n; j >= 0; --j)
		if (j >= step) f[j] = f[j - step];
		else f[j] = 0;
		
	for (int j = 0; j <= n; ++j)
		if (j >= step) f[j] += f[j - step];
	for (int j = 1; j <= n; ++j) ans[j] += f[j];
}

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 200010;
const int mod = 998244353;

int dp[2][N];
int f[N];
int ans[N];
int n, k;

void add(int& a, int b) {
	a += b;
	if (a >= mod) a -= mod;
}

void solve() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; ++i) f[i] = 0;
	f[0] = 1;
	
	for (int step = k, start; (start = (step + k) * (step - k + 1) / 2) <= n; ++step) {
		for (int j = n; j >= 0; --j)
			if (j >= start) f[j] = f[j - step];
			else f[j] = 0;
			
		for (int j = start; j <= n; ++j)
			if (j >= start) add(f[j], f[j - step]);
		for (int j = 1; j <= n; ++j) add(ans[j], f[j]);
	}
	for (int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]); 
}

int main()
{
	int T = 1;
//	scanf("%d", &T);
	for (int i = 1; i <= T; ++i) {
		solve();
	}
	return 0;
}

总结:
避免跳跃性思考,从朴素的二维状态构建好转移方程后,再根据实际优化空间和时间

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【带限制的完全背包】Educational Codeforces Round 133 (Rated for Div. 2) D. Chip Move 的相关文章

  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 带有 ASP.NET 按钮回发的 jQuery UI 对话框

    我的 ASP NET 页面上有一个运行良好的 jQuery UI 对话框 jQuery function jQuery dialog dialog draggable true resizable true show Transfer hi
  • 使用管道在父级和子级之间传递整数值

    我对如何正确使用 pipeline 在两个进程之间传递整数值有点困惑 在我的程序中 我首先创建一个管道 然后分叉它 我假设我有 两个 管道 据我了解 这是我的任务 我的父母通过 for 循环检查某个操作的整数值 i 增加计数变量 并将值保存
  • 并行运行多个任务

    我有一个代理列表 每个代理都会访问不同的站点并从站点中提取所需的数据 目前它一次只做一个 但我希望同时运行 10 20 个任务 这样它就可以一次性从 20 个站点下载 而不是只下载一个 这是我目前正在做的事情 private async T
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本

随机推荐

  • 程序员最爱用的在线代码编辑器合集,哪款是你的最爱?

    程序员最爱用的在线 在线IDE 分享合集 有没有你最爱用的 TitanIDE 首当其冲 TitanIDE 云原生集成开发环境 打开浏览器即可编码 快捷方便 最主要的优势概括为以下几点 1 多内核支持 VSCode Jetbrains IDE
  • 【OS命令注入01】常见OS命令执行函数及其利用(system、exec、passthru、popen、shell_exec及反引号结构)

    目录 1 OS命令注入概述 2 常见可注入函数及利用方法 2 1 system 函数 2 2 exec 函数 2 3 passthru 函数 2 4 popen 函数 2 5 shell exec及反引号结构 3 防御 4 总结 1 OS命
  • anaconda使用笔记(包括pip命令)

    anaconda使用笔记 包括pip命令 1 conda命令 conda命令使用方式 方式一 直接打开Anaconda Prompt即可 方式二 打开anaconda 然后在environment中选择你用的环境 点击运行图标 选择Open
  • ajax请求图片_带你完成第一个爬虫,简单爬取百度图片

    大家好 我是润森 什么是爬虫 网络爬虫 又被称为网页蜘蛛 网络机器人 在FOAF社区中间 更经常的称为网页追逐者 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 另外一些不常使用的名字还有蚂蚁 自动索引 模拟程序或者蠕虫 来源 百
  • 华为数据之道

    由华为董事 质量与流程IT总裁 CIO陶景文 作序推荐 华为质量与流程IT 华为云 华为大学 联合出品 总结华为公司数据治理 数字化转型方面的实践经验 从技术 流程 管理等多个维度系统讲解华为数据治理和数字化转型的著作 华为是一家超大型企业
  • CTFHub

    0x00 前言 CTFHub 专注网络安全 信息安全 白帽子技术的在线学习 实训平台 提供优质的赛事及学习服务 拥有完善的题目环境及配套 writeup 降低 CTF 学习入门门槛 快速帮助选手成长 跟随主流比赛潮流 0x01 题目描述 过
  • QDockWidget详解(二)

    上次在 QDockWidget详解文章中介绍了一些有关QDockWidget的基础用法 今天继续来讲QDockWidget的用法 自定义标题栏 如果不想使用QDockWidget自带的标题栏 那么可以通过 void QDockWidget
  • 阿里云原生大数据计算服务maxcompute学习体验

    这两天有兴趣学习了下阿里的maxcompute大数据 随便谈谈自己的感受 一 感受 阿里云相关的产品线太多了 热门产品一页已经放不下了 正因为东西太多给人一种杂乱的感觉 也可能这是给技术人员用的 所以不用太讲客户体验 反正给我的体验就不太好
  • 五、数据仓库详细介绍(建模)实践篇

    1 数仓建模在数仓建设过程中的位置 这张截图源自之前从 0 到 1 建设数据仓库的经验总结 采用的是瀑布模式的展现方式 但实际操作中经常会使用螺旋迭代模式 因为很难有人能够一步到位的考虑清楚所有细节 通过业务调研我们熟悉了相关业务过程 需求
  • 2023-Python实现巨潮资讯网数据采集

    目录 1 目标网址 2 接口分析调试 3 代码实现 学习记录 巨潮资讯网数据采集 1 目标网址 网页 深证信数据服务平台 巨潮资讯 gt 网行情中心 网页 http webapi cninfo com cn marketDataDate 数
  • 寒假小复习5

    插入排序 public class Insert public static void main String args int nums 12 4 6 2 66 1 4 for int i 1 i lt nums length i int
  • 【华为OD机试 python】新员工座位安排系统【 2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 工位由序列F1 F2 Fn组成 Fi值为0 1或2 其中0代表空置 1代表有人 2代表障碍物 1 某一空位的友好度为左右连续老员工数之和 2 为
  • vue3 element-plus 表格中必填项展示的星号的前后位置设置

    情况一 必填项的星号在前面 情况图片展示 实现方法 直接使用表单规则校验来实现 注意 规则校验一定要绑定prop 代码展示 html
  • Scrapy入门

    文章目录 Scrapy入门 1 目标 2 准备工作 3 创建项目 4 创建 Spider 5 创建 Item 6 解析 Response 7 使用Item 8 后续Request 9 运行 10 保存到文件 11 使用Item Pipeli
  • filebeat+kafka简单使用

    filebeat6 3 1 kafka1 1 0简单使用 前提 kafka1 1 0版本集群搭建和常用命令 下载 下载页面 https www elastic co cn downloads past releases filebeat 6
  • Java语言开发在线新闻推荐网 新闻推荐系统 基于用户、物品的协同过滤推荐算法 环球日报新闻爬虫 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、机器学习、人工智能开发

    Java语言开发在线新闻推荐网 新闻推荐系统 基于用户 物品的协同过滤推荐算法 环球日报新闻爬虫 SSM Spring SpringMVC Mybatis 开发框架 大数据 机器学习 人工智能开发NewsRecommendOnline 一
  • 图像/视频超分之降质过程

    点击上方 计算机视觉工坊 选择 星标 干货第一时间送达 图像 视频超分领域近期并无突破性的方法出现 故近期计划将图像 视频超分相关方法进行一次综述性汇总 计划从不同点出发对图像 视频超分进行一次 反思 之旅 本文是该旅程的第一站 图像降质过
  • 【入侵检测】5.27quiz

    入侵检测 5 27 课上quiz1 3 今天两门课上一共发了4个quiz 属实难顶 quiz1 quiz1是对XTP文件的信息内容进行读取查找 找到相应的flag信息 题目 请输入Linux XTP文件中包含的Flag信息 直接将文件 li
  • 在 Windows 下搭建 Appium + Android 自动化测试环境

    前言 本来并不打算写这么一篇文章 但是实践下来发现网上的各种教程里大致有两个问题 一是文章有些跟不上时代 目前android开发和测试的技术更新都比较快 内容有些过期 二是细节部分不是太完整 拼拼凑凑也能完成 但对新手来说就比较痛苦 那么
  • 【带限制的完全背包】Educational Codeforces Round 133 (Rated for Div. 2) D. Chip Move

    题意 给定 n n n 和 k k k 初始步长为 k k k 每次可以走