题目大意:

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

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

思路:

一眼数位dp

具体见注释

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<queue>
 8 #include<map>
 9 #include<vector>
10 #define ll long long
11 #define inf 2147483611
12 #define MAXN 20
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 int a,b,l[11],cnt;
22 ll dp[11][11],res;
23 ll solve(int x)//可以得到结果是小于等于b的所有数减去小于a的所有数
24 {
25     res=cnt=0;
26     while(x) l[++cnt]=x%10,x/=10;//把数字分解为字符串 cnt为x个数
27     for(int i=1;i<l[cnt];i++) res+=dp[cnt][i];//求出小于x但是位数等于cnt的所有答案
28     for(int i=1;i<=cnt-1;i++)//求出位数不到cnt的所有答案
29         for(int j=1;j<10;j++) res+=dp[i][j];
30     for(int i=cnt-1;i>0;i--)//求出前i-1位和x一样的数且第i-1位小于原数的第i-1位的个数
31     {
32         for(int j=0;j<l[i];j++)
33             if(abs(j-l[i+1])>=2) res+=dp[i][j];//枚举这一位的个数
34         if(abs(l[i+1]-l[i])<2) break;//本身x这两位不满足条件,无法满足条件 退出循环
35     }
36     return res;
37 }
38 int main()
39 {
40     a=read(),b=read();
41     //下面是预处理出整个dp数组:表示长度为j的数首位为i的所有数的个数
42     for(int i=0;i<10;i++) dp[1][i]=1;
43     for(int i=2;i<=10;i++)
44         for(int j=0;j<10;j++)
45             for(int k=0;k<10;k++) if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
46     printf("%lld",solve(b+1)-solve(a));
47 }

View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/7853344.html

bzoj 1026 windy数相关推荐

  1. BZOJ 1026 windy数 (数位DP)

    题意 区间[A,B]上,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 思路 状态设计非常简单,只需要pos.limit和一个前驱数pre就可以了,每次枚举当前位时判断是否与上一位相差2即 ...

  2. HYSBZ - 1026 windy数(数位dp)

    题目链接:点击查看 题目大意:求a到b闭区间内满足相邻两个数字之差大于等于2的数字个数 分析:dp[i][j]表示第i位上数字为j的结果,pos表示位数,pre表示上一位数,lead表示是否有前导0, ...

  3. bzoj 1026 //1026: [SCOI2009]windy数

    bzoj 1026 //1026: [SCOI2009]windy数   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1026 / ...

  4. BZOJ 1026 [SCOI2009]windy数

    1026: [SCOI2009]windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间 ...

  5. [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】

    题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...

  6. bzoj:1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7982  Solved: 3593 Descriptio ...

  7. bzoj 1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7688  Solved: 3470 [Submit][S ...

  8. bzoj 1026: [SCOI2009]windy数 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  9. bzoj 1026: [SCOI2009]windy数

    Time Limit: 1 Sec Memory Limit: 162 MB Submit: 9998 Solved: 4629 [Submit][Status][Discuss] Descripti ...

最新文章

  1. 使用Vscode进行远程炼丹
  2. 基于SSM实现医院疫情管理系统
  3. 程序设计中的几种设计原则
  4. python能print中文吗_python怎么print汉字
  5. 基于matlab的升压斩波实验,升降压斩波电路matlab仿真
  6. B 附录 Idea debug时的问题 Skipped breakpoint at ...
  7. 为什么会出现“无法连接服务器-与网络有关或与实例有关的错误”?
  8. docker 部署 zookeeper+kafka 集群
  9. python pyhook_python使用pyHook.HookManager()返回来的event中,event.Time怎么转换成为datetime形式?...
  10. 各种编程技术资料分享
  11. Linux文件与目录的三种时间状态(mtime,atime,ctime)区别
  12. 双系统还是虚拟机 linux系统时间,mac装双系统好还是虚拟机好_mac装虚拟机好还是双系统-系统城...
  13. 石家庄地铁站项目最终总结报告
  14. Pinterest模式的魅力何在?国内山寨有哪些?
  15. 你的精力分配,决定你的层次
  16. 关于/etc/hosts文件
  17. 常用计算机视觉应用与简介,浅谈计算机视觉的应用与发展
  18. Sharding Sphere ~ Sharding-jdbc分库分表、读写分离
  19. 易學으로 본 鬼神問題 鬼神의 有無
  20. 有类路由和无类路由的深入理解

热门文章

  1. iOS 通知观察者的被调函数不一定运行在主线程
  2. Oracle11gR2 64bit+Oracle11gR2Client32bit+pl/sql 9
  3. 关于AVR单片机熔丝位的设置和拯救方法大全 AVR单片机熔丝位的设置和详细的拯救方法...
  4. Windows Phone 应用程序生命周期
  5. Win32 控件篇(3)
  6. 生成随机数放入整型数组怎么判断有没有重复_图的应用(1)-连通图的最小生成树(Prim算法和Kruskal算法)...
  7. icem密度盒怎么设置_icem一些总结精编版
  8. C++中各种弹出对话框
  9. matlab创建mat格式变量并导入数据
  10. 记录一下HALCON基于可变形,利用CAD画dxf模板进行模板匹配(二)