最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍。

题目:

1255: 数字统计

时间限制: 1 Sec  内存限制: 128 MB
提交: 31  解决: 4
[提交][状态]

题目描述

一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排, 
每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数 
字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 
2,…,9。

输入

给出表示书的总页码的整数n(1≤n≤2^31-1)

输出

输出10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。

样例输入

11

样例输出

1
4
1
1
1
1
1
1
1
1

链接:http://acm.zznu.edu.cn/problem.php?id=1255

数学方法:

其实就是假设每一位是0-9然后进行判断, 计算出结果

#include<stdio.h>
int Slove(int num,int k)
{
int L, R, M, P = , a = num;
int sum = ;
while(a)
{
R = num%P;
M = a%;
L = a/;
if(k)
{
if(k < M)
sum += (L+)*P;
else if(k == M)
sum += L*P + (R+);
else
sum += L*P;
}
else
{
if(a<)
break;
if(k == M)
sum += (L-)*P + (R+);
else
sum += L*P;
}
P *= ;
a /= ; }
return sum;
} int main()
{
int n, ans;
int i;
scanf("%d",&n);
for(i=; i<=; i++)
{
ans = Slove(n,i);
printf("%d\n",ans);
}
return ;
}

数位DP;

这个就比较通用了, 就是套模版, 对数据的处理上 稍加注意, 然后把状态确定好。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL dp[][][][];//dp[位数][数字出现的次数][这个数字是多少][首位是否是0]
int bit[]; LL dfs(int pos,int cou,int num,int flag,bool is0)
{
if( pos == - )
{
return cou;
} if(!flag && dp[pos][cou][num][is0] != -)
return dp[pos][cou][num][is0]; LL ans = ;
int end = flag? bit[pos]: ; for(int i=; i<=end; i++)
{
if(i == num && !(is0 && i == ) )
ans += dfs(pos-, cou+, num, flag && i == end, is0 && i == );
else
ans += dfs(pos-, cou, num, flag && i == end, is0 && i == );
} if(!flag)
dp[pos][cou][num][is0] = ans; return ans;
} void solve(LL n)
{
int len = , i, m = n;
LL ans;
while(n)
{
bit[len++] = n%;
n /= ;
} for(i=; i<=; i++)
{
ans = dfs(len-, , i, , );
printf("%lld\n", ans);
}
// printf("\n\n\n");
} int main()
{
LL a;
memset(dp, - ,sizeof(dp)); while(scanf("%lld", &a) != EOF)
{
solve(a);
}
// printf("\n\n\n");
return ;
}

zznu 1255 数字统计(数位DP, 数学方法)的更多相关文章

  1. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  2. BZOJ 1833 数字计数 数位DP

    题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有 ...

  3. 1833: [ZJOI2010]count 数字计数——数位dp

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...

  4. [bzoj1833][ZJOI2010]count 数字计数——数位dp

    题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因 ...

  5. Luogu P2602 [ZJOI2010]数字计数 数位DP

    很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...

  6. 2018.07.26NOIP模拟 魔法数字(数位dp)

    魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...

  7. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  8. CodeForces 55D Beautiful numbers(数位dp+数学)

    题目链接:http://codeforces.com/problemset/problem/55/D 题意:一个美丽数就是可以被它的每一位的数字整除的数. 给定一个区间,求美丽数的个数. 显然这是一道 ...

  9. 【题解】P2602 数字计数 - 数位dp

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...

随机推荐

  1. Bulk Insert 高效快速插入数据

    BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_nam ...

  2. u盘安装linux(windows7+linux双系统)

    前提条件:1.先装windows7,后装linux系统 2.windows7 里有“未分区的空间”(不是C:,D:,E:) :计算机→管理→存储空间,删除一些压缩卷即可. 3.下载ultraiso → ...

  3. YYCache 源码分析(二)

    本文分析YYMemoryCache实现原理: YYMemoryCache是内存缓存,所以存取速度非常快,主要用到两种数据结构的LRU淘汰算法 1.LRU Cache的容量是有限的,当Cache的空间都 ...

  4. Android(java)学习笔记244:多媒体之SurfaceView

    1. SurfaceView:     完成单位时间内界面的快速切换(游戏界面流畅感). 我们之前知道一般的View,只能在主线程里面显示,主线程中更新UI.但是SurfaceView可以在子线程中里 ...

  5. 图片预览(base64和blob:图片链接)和ajax上传、下载(带进度提示)

    直接上代码 html和js <!DOCTYPE html> <html> <head> <meta name="viewport" con ...

  6. php模拟HTTP协议发送post请求方法

    今天用到php模拟http发送post请求记录 代码如下: <?php $url = 'xxxx.com'; $data = 'a=one&b=two'; $data = urlenco ...

  7. codeforces 251A Points on Line(二分or单调队列)

    Description Little Petya likes points a lot. Recently his mom has presented him n points lying on th ...

  8. 使用MWC四轴起飞侧翻解决方法

    原因如下:1.电机顺序错了,如上图所示,上面蓝色的箭头是机头,绿色的箭头是电机转向,3.10.11.9对应MWC飞控版上的D3,D9,D11,D9,蓝色箭头对应MWC飞控板的箭头 或者传感器的Y轴 以 ...

  9. 读书笔记 |Google C++编程风格指南

    Google C++编程风格指南 ## 0. 背景 每一个C++程序员都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug.难于阅读和维护. 本指 ...

  10. js 实现分割条

    js 实现 切分条效果, 为了熟悉js  写法,纯javascript 脚本编写 简单介绍几个函数: setCapture()函数的作用就是将后续的mouse事件都发送给这个对象, releaseCa ...