博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1026】[SCOI2009]windy数 数位dp
阅读量:5278 次
发布时间:2019-06-14

本文共 1403 字,大约阅读时间需要 4 分钟。

题目描述

windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?

输入

包含两个整数,A B。

输出

一个整数,表示答案

样例输入

【输入样例一】

1 10
【输入样例二】
25 50

样例输出

【输出样例一】

9
【输出样例二】
20


题解

数位dp

快联赛了重写了一下,发现以前写的太傻逼了= =

由于加一个数位的贡献只与最高位有关,因此设 $f[i][j]$ 表示 $i$ 位数,最高位为 $j$ 的数的个数。

那么显然可以得到 $f[i][j]=\sum\limits_{|j-k|\le 2}f[i-1][k]$ 。

预处理出 $f$ 数组后即可进行数位dp。

先把位数不满的算上,然后再从高位到低位把该位不满的加入答案中。

此时需要记录上一个数位是什么,在枚举当前数位时需要满足当前位的条件。并且如果上一个与当前数位产生冲突则不再有满足条件的数,应当跳出循环。

把询问区间转化为 $[1,n)$ 的半开半闭区间更容易处理一些。

代码中为了避免一些细节(比如最高位只能处理到 $2*10^9$ 之类的),开了long long。

#include 
typedef long long ll;ll f[11][10] , b[11];inline int abs(int x){ return x > 0 ? x : -x;}void init(){ int i , j , k; b[0] = 1 , b[1] = 10; for(i = 0 ; i < 10 ; i ++ ) f[1][i] = 1; for(i = 2 ; i < 11 ; i ++ ) { b[i] = b[i - 1] * 10; for(j = 0 ; j < 10 ; j ++ ) for(k = 0 ; k < 10 ; k ++ ) if(abs(j - k) >= 2) f[i][j] += f[i - 1][k]; }}ll calc(ll n){ int i , j , last = -1 , di = 1; ll ans = 0; for(i = 1 ; b[i] <= n ; i ++ ) for(j = 1 ; j < 10 ; j ++ ) ans += f[i][j]; for( ; i ; i -- ) { for(j = di ; j < n / b[i - 1] % 10 ; j ++ ) if(abs(j - last) >= 2) ans += f[i][j]; if(abs(n / b[i - 1] % 10 - last) < 2) break; last = n / b[i - 1] % 10 , di = 0; } return ans;}int main(){ init(); ll n , m; scanf("%lld%lld" , &n , &m); printf("%lld\n" , calc(m + 1) - calc(n)); return 0;}

 

转载于:https://www.cnblogs.com/GXZlegend/p/7811439.html

你可能感兴趣的文章
hdu 3938 并查集
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>