2023河南萌新联赛第(四)场 L.7是大奖?(数位DP基础)

news/2025/3/14 17:13:27/

文章目录

  • 题目大意
  • 题解
  • 参考代码
  • 总结

题目大意

原题
( 1 ≤ l , r ≤ 1 0 18 ) (1\leq l,r\leq 10^{18}) (1l,r1018)

题解

由题目可得
①:统计数字出现次数;
②:直接暴力计算无法得出;
③:输入给定区间。
满足使用数位DP的条件。
tip:
如果我们暴力求解会发现有许多计算重复,数位DP可以帮助我们运用重复计算的部分。
我们把 a n s l , r ans_{l,r} ansl,r 转化为 a n s 1 , r − a n s 1 , l − 1 ans_{1,r}-ans_{1,l-1} ans1,rans1,l1
去除一个维度,就成为了一个单调上升的函数。
其核心思想是枚举数位,搜索过程中记忆化。
数位DP学习
统计 5 5 5 7 7 7 的个数是朴素的数位DP,统计连续的 7 7 7 7 7 7
我们可以加入一个变量统计连续的 7 7 7 的个数。
详细可以看代码。

参考代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=50000;
ll dp[20][50][50][20],num[20];
//len表示当前在第几位,limit表示是否贴着上限,lead表示是否有前导零
//sum5统计5的数量,sum7统计7的数量,siz统计连续的个数
ll dfs(int len,bool limit,bool lead,int sum5,int sum7,int siz)
{ll ans=0;if(len==0)return sum5+sum7*3+(siz>=7)*300;if(!limit && lead && dp[len][sum5][sum7][siz]!=-1)    //记忆化return dp[len][sum5][sum7][siz];int res=limit==1?num[len]:9;           //贴上限for(int i=0;i<=res;i++){if(i!=5 && i!=7)ans+=dfs(len-1,limit&&i==res,lead||i,sum5,sum7,siz>=7?7:0);if(i==5)ans+=dfs(len-1,limit&&i==res,lead||i,sum5+1,sum7,siz>=7?7:0);if(i==7)ans+=dfs(len-1,limit&&i==res,lead||i,sum5,sum7+1,siz>=7?7:siz+1);//特殊的,如果已经有7个7,不需要考虑了,必定加+300//不然需要从0开始重新统计}if(!limit&&lead)            //没有任何限制再加入dp[len][sum5][sum7][siz]=ans;return ans;	
}
ll work(ll x)
{int len=0;while(x)            //取数位{num[++len]=x%10;x/=10;}return dfs(len,1,0,0,0,0);
}
int main()
{int T;ll l,r;memset(dp,-1,sizeof dp);cin>>T;while(T--){scanf("%lld%lld",&l,&r);ll ans=(work(r)-work(l-1));printf("%lld\n",ans);}
}

对于为什么要把 s u m 5 、 s u m 7 、 s i z sum_5 、sum_7、siz sum5sum7siz 写进 DP,
当前的状态可能由不同个上一位转移而来,上一位是 5 5 5 ,和上一位是 7 7 7 的结果显然不同,
所以需要对不同的状态进行分开计算。

总结

数位DP模板题,经验++。


http://www.ppmy.cn/news/1001401.html

相关文章

如何从 html 页面调用在 javascript 模块 (type=module) 中声明的函数

首先&#xff0c;必须明确导出您的功能 export function greet() {alert("Hello from module"); } 其次&#xff0c;模块有它自己的范围&#xff08;这是模块的全部意义&#xff09;&#xff0c;因此您需要将函数添加到全局范围。因此&#xff0c;要做到这一点&…

企业真实的自动化框架?资深8年测试是如何设计实施的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是框架&#…

docker 哨兵模式和集群模式安装Redis7.0.12

docker 哨兵模式和集群模式安装Redis7.0.12 1.下载镜像 1.1 配置阿里云加速源 墙外能访问https://hub.docker.com/_/redis 的可跳过 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录后选择左侧的镜像工具>镜像加速器&#xff0c;获取加速器地址&#…

活动目录密码更改

定期更改密码是一种健康的习惯&#xff0c;因为它有助于阻止使用被盗凭据的网络攻击&#xff0c;安全专家建议管理员应确保用户使用有效的密码过期策略更改其密码。 管理员可以通过电子邮件通知用户在密码即将过期时更改其密码&#xff0c;但在许多组织中&#xff0c;用户只能…

【MYSQL】MYSQL学习笔记【基础篇】【未完待续】

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库&#xff0c;数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.3 MySQL数据库安装1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2…

spring boot+thymeleaf+semantic ui 分页

参考&#xff1a; https://my.oschina.net/ayyao/blog/898041 后端 springboot 使用&#xff1a; com.github.pagehelper.PageInfo&#xff0c;作为分页对象 <!--引入分页插件--> <dependency><groupId>com.github.pagehelper</groupId><artifa…

【CSS】3D卡片效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"card"><img…

[Linux]手把手教你制作进度条小程序

[Linux]制作进度条小程序 文章目录 [Linux]制作进度条小程序C语言中的\n和\r字符缓冲区的刷新策略进行进度条代码编写 C语言中的\n和\r字符 C语言中字符分为两种: 可显字符控制字符 其中可显字符就是字符a这类的字符&#xff0c;控制字符就是\n这种控制字符。 对于我们制作…