[USACO2003 Dec]Cow Queueing数数的梦 (基础水数位DP带注释!)

2024-05-12 00:08

本文主要是介绍[USACO2003 Dec]Cow Queueing数数的梦 (基础水数位DP带注释!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://acm.tju.edu.cn/toj/showp2839.html(真的找不到链接了)

题目大意:

给你一个范围A~B,求出在整数A 到B之间,0到9这十个数字,分别出现了多少次?

1≤A,B≤10^18

样例输入  129 137

样例输出  1 10 2 9 1 1 1 1 0 1


题解:

数位DP

我的第一道数位DP。。尽管是基础水题但是搞了好久ORZ &&感谢关大学霸%%%!

范围A~B,那么就先算出在1~B中这十个数字分别出现了多少次。再算出在1~A-1中各出现了多少次,然后相减就好了。

[我都是 最高位从1开始...就是诶待会看下图]

以样例为例。先说一下什么叫上限边缘。

假设算的是1~137中各个数的出现次数。现在做到了第2位,如果前面枚举的是1,那么就处于上限边缘。枚举当前位,即第2位为3的话,仍处于上限边缘,而为0~2的话就不在上限边缘了。

然后就用图说明一下bit[]和ret[]存的是什么好了。其他的代码里有,很多很多注释!怕自己以后看不懂...


...bit[]就不画了= =,意思也差不多。bit[i]=10^i。因为还没限制,所以可以填的总数就是bit[后面有几位].

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;LL f[20][2][2];
//f[i][flag][zero]表示搞到第i位 flag-0/1 zero-0/1的时候某数的数目
//flag表示该位是不是在上限边缘 zero表示目前是否还是前导零
LL d[10],bit[20],ret[20];
char s[20];int len;
LL dfs(int x,int i,int flag,int zero)
{if (f[i][flag][zero]!=-1) return f[i][flag][zero];//记忆化↑ 不加超时if (i>len) return 0;LL ans=0;if (flag)//如果前面的部分处于上限边缘{int j=s[i]-'0';//该位的上限是多少for (int k=0;k<j;k++)//枚举该位填什么{ans+=dfs(x,i+1,0,zero&(k==0));//不是上限的边缘↑了  ↑就是看看还是不是前导0if (k==x && !(zero&(k==0))) ans+=bit[len-i];//如果k是要统计次数的那个数字 而且不是在前导零的时候//而且还不是在上限的边缘!//那么后面几位的数字有多少种填法x就出现了几次}ans+=dfs(x,i+1,1,zero&(j==0));//该位填上限就仍在上限边缘if (j==x && !(zero && (j==0))) ans+=ret[i]+1;//如果填的是要统计次数的那个数字 而且不是在前导零的时候//那么后面的数字最多有多少种填法x就出现了几次(受限的哦!}else//↓就没有限制啦随便填 该统计的时候跟上面同理统计{for (int k=0;k<=9;k++){ans+=dfs(x,i+1,0,zero&(k==0));if (k==x && !(zero && (k==0))) ans+=bit[len-i];}}f[i][flag][zero]=ans;//记忆化return ans;
}
void cl()//把A减1 其实这样最高位可能变成了0 
//但是我的最高位是从1开始往后存的 所以没办法..(懒得全部往前挪一下= =
{int t=len;while (t>1 && s[t]=='0'){s[t]='9';t--;}s[t]--;
}
int main()
{//freopen("dream.in","r",stdin);//freopen("dream.out","w",stdout);int i;memset(d,0,sizeof(d));scanf("%s ",s+1);bit[0]=1;for (i=1;i<=18;i++) bit[i]=bit[i-1]*10;len=strlen(s+1);cl();ret[len]=0;for (i=len-1;i>=1;i--) ret[i]=(s[i+1]-'0')*bit[len-i-1]+ret[i+1];for (i=0;i<=9;i++){memset(f,-1,sizeof(f));d[i]-=dfs(i,1,1,1);}scanf("%s",s+1);len=strlen(s+1);ret[len]=0;for (i=len-1;i>=1;i--) ret[i]=(s[i+1]-'0')*bit[len-i-1]+ret[i+1];for (i=0;i<=9;i++){memset(f,-1,sizeof(f));d[i]+=dfs(i,1,1,1);}for (i=0;i<9;i++)printf("%d ",d[i]);printf("%d\n",d[9]);return 0;
}

这篇关于[USACO2003 Dec]Cow Queueing数数的梦 (基础水数位DP带注释!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981045

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

00 - React 基础

1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名如:npx create-react-app react-redux-pro JSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 JavaScript 代码中编写 HTML。 const element =

AI赋能天气:微软研究院发布首个大规模大气基础模型Aurora

编者按:气候变化日益加剧,高温、洪水、干旱,频率和强度不断增加的全球极端天气给整个人类社会都带来了难以估计的影响。这给现有的天气预测模型提出了更高的要求——这些模型要更准确地预测极端天气变化,为政府、企业和公众提供更可靠的信息,以便做出及时的准备和响应。为了应对这一挑战,微软研究院开发了首个大规模大气基础模型 Aurora,其超高的预测准确率、效率及计算速度,实现了目前最先进天气预测系统性能的显著

【软考】信息系统项目管理师(高项)备考笔记——信息系统项目管理基础

信息系统项目管理基础 日常笔记 项目的特点:临时性(一次性)、独特的产品、服务或成果、逐步完善、资源约束、目的性。 临时性是指每一个项目都有确定的开始和结束日期独特性,创造独特的可交付成果,如产品、服务或成果逐步完善意味着分步、连续的积累。例如,在项目早期,项目范围的说明是粗略的,随着项目团队对目标和可交付成果的理解更完整和深入时,项目的范围也就更具体和详细。 战略管理包括以下三个过程

众所周知,配置即代码≠基础设置即代码

​前段时间翻到几条留言,问: “配置即代码和基础设施即代码一样吗?” “配置即代码是什么?怎么都是基础设施即代码?” 我们都是知道,DevOp的快速发展,让服务器管理与配置的时间大大减少,配置即代码和基础设施即代码作为DevOps的重要实践,在其中起到了关键性作用。 不少人将二者看作是一件事,配置即大代码是关于管理特定的应用程序配置设置本身,而基础设施即代码更关注的是部署支持应用程序环境所需的

iOS:编译时出现no such file or directory:xxx以及use twice...filenames are used to distinguish private dec

简    注册  登录   添加关注 作者  婉卿容若 2016.04.29 11:22 写了21870字,被16人关注,获得了14个喜欢 iOS:编译时出现"no such file or directory:xxx"以及"use twice...filenames are used to distinguish private