博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ-1026】windy数 数位DP
阅读量:4693 次
发布时间:2019-06-09

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

1026: [SCOI2009]windy数

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 5230  Solved: 2353
[][][]

Description

  windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,

在A和B之间,包括A和B,总共有多少个windy数?

Input

  包含两个整数,A B。

Output

  一个整数

Sample Input

【输入样例一】
1 10
【输入样例二】
25 50

Sample Output

【输出样例一】
9
【输出样例二】
20

HINT

【数据规模和约定】

100%的数据,满足 1 <= A <= B <= 2000000000 。

Source

Solution

数位DP裸题

F[i][j]表示位数为i的最高位为j的满足条件的个数

随便转移一下就好,注意0的时候要特判

Code

#include
#include
#include
#include
#include
using namespace std;int L,R;int F[20][10];void prework(){ for (int i=0; i<=9; i++) F[1][i]=1; for (int i=2; i<=10; i++) for (int j=0; j<=9; j++) for (int k=0; k<=9; k++) if (abs(j-k)>=2) F[i][j]+=F[i-1][k];}int Calc(int x){ if (x==0) return 0; int digit[11],len=0,ans=0; while (x) {digit[++len]=x%10; x/=10;} for (int i=1; i
=1; i--) { if (i==1 && abs(digit[i+1]-digit[i])>=2) ans++; for (int j=0; j<=digit[i]-1; j++) if (abs(digit[i+1]-j)>=2) ans+=F[i][j]; if (abs(digit[i+1]-digit[i])<2) break; } return ans;}int main(){ scanf("%d%d",&L,&R); prework(); printf("%d\n",Calc(R)-Calc(L-1)); return 0;}

sb数位DP系列..水的不能再水了...

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5449177.html

你可能感兴趣的文章
入门Webpack,看这篇就够了
查看>>
短信拦截马”黑色产业链与溯源取证研究
查看>>
最小公倍数
查看>>
asp.net如何定时执行任务
查看>>
prim
查看>>
noip2013花匠
查看>>
[CF]Equalize Them All
查看>>
React Ant design table表单与pagination分页配置
查看>>
linux tail 命令详解
查看>>
BZOJ-1069 [SCOI2007]最大土地面积
查看>>
进程与线程的一个简单解释【摘】
查看>>
COJ976 WZJ的数据结构(负二十四)
查看>>
slid.es – 创建在线幻灯片和演示文稿的最佳途径
查看>>
2016年6月份那些最实用的 jQuery 插件专辑
查看>>
如何在数据库中使用索引
查看>>
ring0
查看>>
windows虚拟机下 安装docker 踩过的坑
查看>>
使用 CXF 做 webservice 简单例子
查看>>
2017-2018-1 20155339 《信息安全系统设计基础》第8周学习总结
查看>>
socket.io 消息发送
查看>>