博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数位dp——BZOJ1026 Windy数
阅读量:4628 次
发布时间:2019-06-09

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

1026: [SCOI2009]windy数

Time Limit: 1 Sec  Memory Limit: 162 MB

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 。

 

很经典的模板题。

1 #include
2 #include
3 #include
4 #define foru(i,x,y) for(int i=x;i<=y;i++) 5 #define clr(a) memset(a,0,sizeof(a)) 6 using namespace std; 7 int bit[20],f[20][20],l,a,b; 8 int dfs(int pos,int pre,int lim){
//当前位置 前一位的数字 是否有限制 9 if(pos<=0)return 1;10 if(pre>=0&&!lim&&f[pos][pre]!=-1)return f[pos][pre];//如果当前没有限制且此情况已搜索过,则返回 11 int rng=(lim?bit[pos]:9),ret=0;//确定范围 12 foru(i,0,rng)13 if(abs(i-pre)>=2)//如果符合要求 递归下一位 14 ret+=dfs(pos-1,(pre<0&&i==0)?pre:i,lim&&(i==rng));//下一位 判断是否为第一位 是否有限制 15 if(pre>0&&!lim)f[pos][pre]=ret;//若无限制 记录 16 return ret;17 }18 19 int calc(int k){20 int l=0;21 while(k){bit[++l]=k%10;k/=10;}22 memset(f,-1,sizeof(f));23 return dfs(l,-10,1);24 }25 26 int main(){27 scanf("%d%d",&a,&b);28 printf("%d\n",calc(b)-calc(a-1));29 }

 

转载于:https://www.cnblogs.com/y-m-y/p/6663699.html

你可能感兴趣的文章
前端基础之JQuery
查看>>
AppStore SDK
查看>>
springboot 学习笔记(三)
查看>>
Nginx 主要应用场景
查看>>
记录一次爬取某昵称网站的爬虫
查看>>
lattice diamond 3.7安装破解
查看>>
FPGA研发之道(25)-管脚
查看>>
BFS之三(单向bfs和康托压缩)
查看>>
Web App、Hybrid App与Native App的设计差异
查看>>
ASP.NET将原始图片按照指定尺寸等比例缩放显示图片
查看>>
测试用例设计方法基础理论知识
查看>>
基于visual Studio2013解决面试题之0804复杂链表
查看>>
find_in_set
查看>>
【转帖】SQLServer登录连接失败(error:40-无法打开到SQLServer的连接)的解决方案...
查看>>
ibatis的there is no statement named xxx in this SqlMap
查看>>
系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常...
查看>>
《Python学习手册》读书笔记
查看>>
简单数据结构(队列 栈 树 堆 )
查看>>
洛谷P2380 狗哥采矿
查看>>
learning to openstack concept
查看>>