一道有点仙的数位dp 方伯伯的商场之旅

news2024/11/14 18:16:15

link

大意:

 

 思路:

先来考虑单个数字的情况
其实首先可以将题意稍微转化一下,就是移动一个石子的代价是其移动的距离。这样的话,显然我们的策略就是对于每一个石子,一次性将其移动到正确的位置,毕竟能一步到位为什么要分两次呢。在此基础上,我们要做的就是选择一个最终的合并的位置,使得移动的总距离最小

这个的结论还是比较显然的,就是所以石子位置的中位数。

接下来看看多个数字的问题

显然我们不可能对于每一个数字都去找它的最佳位置。但是如果已经知道最佳位置的话,利用数位dp,我们可以很快知道转移到该位置的总代价。那么不妨来看看最终位置转移的时候需要改变什么。如果统计转移的代价可以接受的话,这题就有突破口了,毕竟总位数不会很多。

假设当前在位置pos,当pos+1的时候,显然总代价改变的值det就是:位置>pos的数字个数-位置<=pos的数字个数,当pos右移的时候,前者的值单调增加,后者的值单调减小,所以这个改变的值det也是单调增加的。所以我们可以得出一个递推来找到最佳位置的策略:pos从1开始向右推,如果右移一位的总代价改变值<0,也就是总代价可以变小,就右移一位,否则就break即可。

这个转移其实也不难统计,就是维护一下每一个数字在对应位置的贡献即可。这里dfs2统计的是从上一位转移过来后对总代价的减小值。如果结果大于0的话,就说明减小值为正,否则我们就让其与0取最大即可,相当于不转移。

ll dfs2(ll x,ll head,ll pos,ll sum)
{
	if(sum<0) return 0;
	if(x==0) return max(sum,0ll); 
	if(!head&&dp[x][sum]!=-1) return dp[x][sum];
	ll tot=0;
	ll lim=head?a[x]:k-1;
	for(int i=0;i<=lim;++i)
	{
		tot+=dfs2(x-1,head&&i==lim,pos,sum+((x<pos)?-i:i));
	}
	if(!head) dp[x][sum]=tot;
	return tot;
}

但是这里sum,也就是变小的贡献,在统计过程中是有可能小于0的。为了防止越界,我们可以在一开始就判断一下,如果sum<0,就return 0.合理性在于,我们的数位dp是从高位往低位做的,也就是说sum是先增后减的,如果sum已经小于0了,它也不可能再变大了。


最后,我们只要统计出转移到第一个位置的总代价,然后向右递推即可。

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
const ll mod=1000007;
ll n,m,k;
ll a[60];
ll cnt=0;
ll dp[60][4010];
ll init_dfs(ll x,ll head,ll sum)
{
	if(x==0) return sum;
	if(!head&&dp[x][sum]!=-1) return dp[x][sum];
	ll tot=0;
	ll lim=head?a[x]:k-1;
	for(int i=0;i<=lim;++i)
	{
		tot+=init_dfs(x-1,head&&i==lim,sum+i*(x-1));
	}
	if(!head) dp[x][sum]=tot;
	return tot;
}
ll dfs2(ll x,ll head,ll pos,ll sum)
{
	if(sum<0) return 0;
	if(x==0) return max(sum,0ll); 
	if(!head&&dp[x][sum]!=-1) return dp[x][sum];
	ll tot=0;
	ll lim=head?a[x]:k-1;
	for(int i=0;i<=lim;++i)
	{
		tot+=dfs2(x-1,head&&i==lim,pos,sum+((x<pos)?-i:i));
	}
	if(!head) dp[x][sum]=tot;
	return tot;
}
ll f(ll x)
{
	memset(dp,-1,sizeof dp);
	cnt=0;
	while(x)
	{
		a[++cnt]=x%k;
		x/=k;
	}
	ll ans=init_dfs(cnt,1,0);
	for(int i=2;i<=cnt;++i)
	{
		memset(dp,-1,sizeof dp);
		ll det=dfs2(cnt,1,i,0);
		if(det) ans-=det;
		else break;
//		ans-=dfs2(cnt,1,i,0);
	}
	return ans;
}
void solve()
{
	cin>>n>>m>>k;
	cout<<f(m)-f(n-1)<<endl;
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//	ll t;cin>>t;while(t--)
	solve();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axure教程—选择器

本文将教大家如何用AXURE中的动态面板制作选择器 一、效果 预览地址&#xff1a;https://zhihp9.axshare.com 二、功能 用户点击选择框&#xff0c;可以显示下拉选择器&#xff0c;点击后选择对应项。 三、制作 1、选择框 拖入一个矩形&#xff0c;设置大小为16438&#xff…

macOS Ventura 13.4.1 (22F82) Boot ISO 原版可引导镜像下载

macOS Ventura 13.4.1 (22F82|22F2083) Boot ISO 原版可引导镜像下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Wind…

EMC学习笔记(六)优选布线层

EMC学习笔记&#xff08;六&#xff09;优选布线层 1. 表层与内层走线的比较1.1 微带线&#xff08;microsstrip&#xff09;1.2 带状线&#xff08;stripline&#xff09;1.3 微带线与带状线的比较 2.布线层的优先级别 对于时钟、高频、高速、小、弱信号而言&#xff0c;选择合…

React封装axios请求

1、前言 因为最近在进行老系统用新框架改造&#xff0c;正好用到了react&#xff0c;就顺便整理了一下react中对axios进行封装的相关知识点和步骤。 2、如何封装 可以参考一下chat gpt给出的回答。 我大概总结一下&#xff0c;其实就是使用axios.create创建一个axios的实例&…

基于座位预约管理系统的设计与实现

前言&#xff1a; 各位小伙伴儿们端午节快乐&#xff0c;本篇文章为大家带来一份基于ssm技术搭建的项目&#xff0c;正在学习这块技术的童靴们可以体验一下哦&#xff0c;在资源中可获取源码 ~ 以下正文开始&#xff1a; 文章目录 需求分析功能模块项目架构图首页部分Controll…

存储笔记 - 整理

文章目录 第一章 存储系统introlesson 1何为数据&#xff1f;类型与关系 lesson 2 存储系统环境lesson 1lesson 2 Disk Drive 数据保护 RAIDlesson 1 智能存储lesson 第二章 存储网络技术与虚拟化DAS 直连式存储与 SCSIlesson 直连存储lesson&#xff1a; SCSI简介summary SANl…

长尾关键词有什么作用?要怎么用?

长尾关键词很多的网站都会忽略其存在&#xff0c;其实你不要小看长尾关键词&#xff0c;他将带给网站的流量也是极其可观的&#xff0c;所说比不上那些重点关键词的流量&#xff0c;但是对提升网站的权重还是有着重要的作用。 长尾关键词有什么用&#xff1f;长尾关键词的3…

基于spss的多元统计分析 之 因子分析(4/8)

实验目的&#xff1a; 1&#xff0e;掌握因子分析的基本思想&#xff1b; 2&#xff0e;熟悉掌握SPSS软件进行因子分析的基本操作&#xff1b; 3&#xff0e;利用实验指导的实例数据&#xff0c;上机熟悉因子分析方法。 实验内容&#xff1a; 附表的数据来自一次对液晶电视的调…

English Learning - L3 作业打卡 Lesson7 Day48 2023.6.21 周三

English Learning - L3 作业打卡 Lesson7 Day48 2023.6.21 周三 引言&#x1f349;句1: I thought the worst was over until weeks later when I saw my new legs for the first time.成分划分弱读连读爆破语调 &#x1f349;句2: I didn’t know what to expect but I wasn‘…

【C++】 Qt-认识Qt

文章目录 Qt简介Qt建立工程准备建立控制台程序建立桌面窗口程序 Qt简介 Qt&#xff08;官方发音[kju:t]&#xff0c;同音cute&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&am…

Android之 日历单选多选控件

一&#xff0c;效果图 1.1 单选 2.2 多选 二 实现思路 2.1 数据来源&#xff0c;利用原生日历Calendar&#xff0c;获取从本月开始的往后一年的日期&#xff0c;遍历月数添加全部天数据 private void initCalendarData() {Calendar calendar Calendar.getInstance();year …

Chrome(Manifest Version 3) 浏览器扩展插件基础教程

文章目录 一、简介二、核心介绍三、自定义页面背景色三、设置页面背景图&#xff08;web_accessible_resources&#xff09;四、设置徽章&#xff08;Badge&#xff09;五、桌面通知六、消息通信七、自定义右键菜单&#xff08;添加、更新、删除&#xff09;八、Omnibox九、浏览…

网安笔记--整合

文章目录 1 intro威胁因素 2 加密密码体制分类安全性 3 DESDES工作模式多重DES和安全性加密策略 4 RSA PKCS保密系统体制分类单向函数用处 RSAElgamal 5 SHAHASHSHA-1SHA-2 6 数字签名基本概念签名体系MAC 消息认证码 7 密码协议协议距离协议分类密钥建立协议认证建立协议认证的…

云原生监控平台 Prometheus 的相关概念及部署

1 Prometheus简介 Prometheus 是一个开源的系统监控和报警系统&#xff0c;在 2012 年由 SoundCloud 公司创建&#xff0c;并于 2015 年正式发布。2016 年&#xff0c;Prometheus 正式加入 CNCF (Cloud Native Computing Foundation)&#xff0c;成为继kubernetes之后第二个在C…

Redis---集群

目录 一、集群的介绍 1.1 为什么需要集群呢&#xff1f; 1.2 什么是集群&#xff1f; 1.2 集群能干什么呢&#xff1f; 二、集群的算法之分片&槽位slot 2.1 什么是槽位slot&#xff1f; 2.2 分片 2.3 使用槽位和分片的优势 2.4 slot 槽位映射的三种算法 1、哈…

postgresql 从应用角度看快照snapshot使用,事务隔离控制不再神密

​专栏内容&#xff1a;postgresql内核源码分析 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 快照使用 快照是事务中使用&#xff0c;配合事务的隔离级别&#xff0c;体现出不同的可见性。…

端午节粽子(python)

目录 前言 正文 粽叶绘制 粽叶绳绘制 祝福语绘制 源代码 总结 前言 今天端午节&#xff0c;然后昨天也学习一下绘图的相关知识&#xff0c;然后就想看一下能不能画一下&#xff0c;结果还是有点困难的&#xff0c;用CharAI生成简直一言难尽了。后面是找了一个改了一下。 …

MicroBlaze Processor hello world实验

MicroBlaze Processor hello world实验 实验目的 搭建microblaze工程&#xff0c;通过串口打印hello world&#xff0c;了解microblaze的使用&#xff0c;加深对FPGA硬件和软件开发的理解。 实验原理 MicroBlaze Processor是xilinx提供的一个软核处理器&#xff08;使用FPGA…

Delta型腿机器狗全动作展示

1. 功能说明 本文示例将实现R322样机Delta型腿机器狗维持身体平衡、原地圆形摆动、原地踏步、蹲起、站立、前进、后退、转向、横向移动、斜向移动等功能。 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展…

追寻技术巅峰:开发者的端午征途

近年来&#xff0c;随着信息技术的飞速发展&#xff0c;开发者们以前所未有的速度和规模推动着技术的进步。而正如端午节的文化内涵所体现的那样&#xff0c;我们以屈原名言为指引&#xff0c;勉励着广大开发者在技术征途上不断追求极致&#xff0c;勇往直前。 一、端午节与技术…