BZOJ1026:[SCOI2009]windy数——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1026
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
————————————————————————————————————
今天开始学数位dp了!
所以趁着这道题还简单赶紧记录下来。
设dp(n)表示0~n的windy数个数。
设f[i][j][0/1]表示当前处理到第i位数为j,此时前i位数比n的前i位数小于等于(为0)/大于(为1)的数的个数。
显然我们求a~b的个数可以利用前缀和,只需要求dp(b)再减去dp(a-1)即可。
那么对于函数dp(n),其主要流程:
1.将n拆成十进制数,存在数组中(这里数组为a,长度为len)
2.特殊处理第一层:
for(int i=;i<=;i++){
if(i<=a[])f[][i][]=;
else f[][i][]=;
}
3.枚举i=2~len层并处理之,枚举当前层填充的数字j和上一层填充数字k。当符合windy数的条件时开始更新,更新方程较显然就不多说了:
if(j<a[i])
f[i][j][]+=f[i-][k][]+f[i-][k][];
else if(j==a[i])
f[i][j][]+=f[i-][k][],f[i][j][]+=f[i-][k][];
else f[i][j][]+=f[i-][k][]+f[i-][k][];
4.得出答案。这里需要注意对于最后一层需要特殊处理防止越出0~n的范围。也很显然。
整套流程至此完毕,复杂度显然为log级别。
PS:判断是否为windy数很简单,这里用了一个辅助数组c[i][j]表示abs(i-j),借此判断能够美化代码(滑稽)
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int a[N],f[N][N][],c[N][N];
int dp(int x){
int len=;
while(x)a[++len]=x%,x/=;
if(len==)a[++len]=;
memset(f,,sizeof(f));
for(int i=;i<=;i++){
if(i<=a[])f[][i][]=;
else f[][i][]=;
}
for(int i=;i<=len;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
if(c[j][k]>=){
if(j<a[i])
f[i][j][]+=f[i-][k][]+f[i-][k][];
else if(j==a[i])
f[i][j][]+=f[i-][k][],f[i][j][]+=f[i-][k][];
else f[i][j][]+=f[i-][k][]+f[i-][k][];
}
}
}
}
int ans=;
for(int i=;i<=a[len];i++)ans+=f[len][i][];
for(int i=len-;i;i--){
for(int j=;j<=;j++){
ans+=f[i][j][]+f[i][j][];
}
}
return ans;
}
int main(){
for(int i=;i<=;i++){
for(int j=i;j<=;j++){
c[i][j]=c[j][i]=j-i;
}
}
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",dp(b)-dp(a-));
return ;
}
BZOJ1026:[SCOI2009]windy数——题解的更多相关文章
- BZOJ1026 SCOI2009 windy数 【数位DP】
BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...
- bzoj1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8203 Solved: 3687[Submit][Sta ...
- bzoj1026: [SCOI2009]windy数(传说你是数位DP)
1026: [SCOI2009]windy数 题目:传送门 题解: 其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP 今天回来深造一发... 其实如果对这个算法稍有了解...看到这题的 ...
- BZOJ1026: [SCOI2009]windy数[数位DP]
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6346 Solved: 2831[Submit][Sta ...
- 【数位DP】bzoj1026: [SCOI2009]windy数
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4163 Solved: 1864[Submit][Sta ...
- 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...
- bzoj千题计划117:bzoj1026: [SCOI2009]windy数
http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位DP 如果前一位填的是0, 0是前导0,下一位可以随便填 0不是前导0,下一位不能填1 为 ...
- C++ 洛谷 P2657 [SCOI2009]windy数 题解
P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...
- [bzoj1026][SCOI2009]windy数_数位dp
windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...
随机推荐
- SpringCloud Eureka 服务注册与服务发现
一.Eureka简介 spring Cloud Netflix技术栈中,Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只 ...
- hdu1069Monkey and Banana(动态规划)
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 第六模块:WEB框架开发 第1章·Django框架开发50~87
51-表关系之一对多 52-表关系之多对多 53-表关系之一对一 54-数据库表关系之关联字段与外键约束 55-数据库表关系之sql创建关联表 56-ORM生成关联表模型 57-多表操作之一对多添加记 ...
- Java集合学习--集合总结
一.ArrayList与Vector ArrayList与Vector很多地方大同小异,Vector现在已经基本不再使用.具体的管理如下:1.ArrayList与Vector都实现了List接口,底层 ...
- 【C#】arcface人脸识别使用问题分析
arcface上线了新版 正好有空 赶紧下载体验了一番 凡是过程中也遇到一些问题 1.初始化 [DllImport("libarcsoft_face_engine.dll", En ...
- JavaScript筑基篇(一)->变量、值与对象
说明 JavaScript中变量.值.对象的理解.本文为了简化理解,前半部分暂时刨除与执行上下文的相关概念.另外本文是个人的见解,如有疑问或不正支持,欢迎提出指正和讨论! 目录 前言 参考来源 变量与 ...
- 20172333 2017-2018-2 《Java程序设计》第7周学习总结
20172333 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容 1.继承是创建新类的快捷方式之一,继承可以使用父类的所有方法及对象. 2.继承具有单向性,父类不 ...
- 项目UML设计--日不落战队
[团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...
- PagedDataSource数据绑定控件和AspNetPager分页控件结合使用列表分页
1.引用AspNetPager.dll. 2.放置Repeater数据绑定控件. <asp:Repeater ID="Repeater1" runat="serve ...
- win10 64位系统中安装多个jdk版本的切换问题
前言: 近期要更换oracle jdk到zulu jdk,因此在本地先安装一版zulu的来进行代码的编译和比较. 注释: 本地电脑之前是oracle jdk 1.8,要更换为zulu jdk 1.8. ...