BZOJ 1026:windy数(数位DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1026
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 5561 Solved: 2493
[Submit][Status][Discuss]
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 10 的答案是 1 - 9。
所以可能最高位如果前面都是零的话,那么它可以任意选择一个数(0 - 位上限)
如果最高位前面不全都是零的话,那么它就要按照规则即和前一位相差2来取。
还是太弱了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 35
//long long dp[N][15][2][2];
long long dp[N][][];
int bit[N];
/*
zero判断前面是不是全都是 0,
1的话说明前面没有前导零,有值
0的话说明前面没有值,都是零
*/
//我一开始的写法
//long long dfs(int pos, int pre, int st, int zero, int flag)
//{
// if( !pos ) return st;
// if( zero && !flag && dp[pos][pre][st][zero] != -1 ) return dp[pos][pre][st][zero];
//
// long long ans = 0;
// int u = flag ? bit[pos] : 9;
//
// if( zero == 0 ){
// for(int i = 0; i <= u; i++){
// ans += dfs(pos - 1, i, i == 0 ? 0 : 1, i == 0 ? 0 : 1, flag && i==u);
// }
// }
// else{
// for(int i = 0; i <= u; i++){
// if( abs(pre - i) >= 2 ){
// ans += dfs(pos - 1, i, 1, 1, flag && i==u);
// }
// }
// }
//
// if( zero && !flag ) dp[pos][pre][st][zero] = ans;
// return ans;
//}
//看了别人的写法,简化了很多
long long dfs(int pos, int pre, int zero, int flag)
{
if( !pos ) return ;
if( zero && !flag && ~dp[pos][pre][zero] ) return dp[pos][pre][zero]; long long ans = ;
int u = flag ? bit[pos] : ; for(int i = ; i <= u; i++){
if( !zero || abs(pre - i) >= )
/*
例如第一个样例 1 10 的答案是 1 - 9
所以可能最高位如果前面都是零的话,那么它可以任意选择一个数(0 - u)
如果最高位前面不行全都是零的话,那么它就要按照规则即和前一位相差2来取
这一题的没有前导零还有第一个样例搞得我很迷糊。我还是太弱了
*/
ans += dfs(pos - , i, i || zero, flag && i==u);
}
if( !flag ) dp[pos][pre][zero] = ans;
return ans;
} long long solve(long long x)
{
int l = ;
while(x>){
bit[++l] = x % ;
x /= ;
}
// return dfs(l, 0, 0, 0, 1);
return dfs(l, , , );
} int main()
{
long long a, b;
cin >> a >> b;
memset(dp, -, sizeof(dp));
if(a > b) swap(a, b);
// cout << solve(b) << " " << solve(a-1) << endl;
cout << solve(b) - solve(a-) << endl;
return ;
}
BZOJ 1026:windy数(数位DP)的更多相关文章
- BZOJ 1026 windy数 (数位DP)
题意 区间[A,B]上,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 思路 状态设计非常简单,只需要pos.limit和一个前驱数pre就可以了,每次枚举当前位时判断是否与上一位相差2即 ...
- BZOJ 1016 Windy 数 | 数位DP
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 题解: f[i][j][1/0]表示枚举到第i位,这位开头是j,当前的数大于(1)或小 ...
- [bzoj 1026]windy数(数位DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 分析: 简单的数位DP啦 f[i][j]表示数字有i位,最高位的数值为j的windy数总 ...
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- BZOJ 1026 windy数【数位DP】
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 10142 Solved: 4712[Submit][St ...
- bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...
- bzoj 1026: [SCOI2009]windy数 & 数位DP算法笔记
数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...
- bzoj 1026 [SCOI2009]windy数——数位dp水题
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #in ...
- 【BZOJ-1026】windy数 数位DP
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5230 Solved: 2353[Submit][Sta ...
- BZOJ 1026 windy数
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...
随机推荐
- WPF Path实现虚线流动效果
原文:WPF Path实现虚线流动效果 最近闲来无事,每天上上网,看看博客生活也过得惬意,这下老总看不过去了,给我一个任务,叫我用WPF实现虚线流动效果,我想想,不就是虚线流动嘛,这简单于是就答应下来 ...
- 用C语言编写Windows服务程序的五个步骤
Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择.本文将建立并实现一个简单的服务程序,其功能是查询系统 ...
- Win8Metro(C#)数字图像处理--2.22二值图像膨胀
原文:Win8Metro(C#)数字图像处理--2.22二值图像膨胀 [函数名称] 二值图像膨胀函数DilationProcess(WriteableBitmap src) [算法说明] 膨胀 ...
- 微信小程序实战之天气预报
原文:微信小程序实战之天气预报 这个案例是仿UC中天气界面做的中间也有点出入,预留了显示当前城市名字和刷新图标的位置,自己可以写下,也可以添加搜索城市.值得注意的是100%这个设置好像已经不好使了,可 ...
- Windows 10预装应用太多?一个命令删除!
Windows 10预装了很多应用软件,虽然有些其实也不难用,但是使用率可能比较低,很多人也不喜欢预装的东西,而且还占空间,那么这些预装的如何彻底清除呢? 其实微软是自带了命令可以执行这样的操作,用它 ...
- PowerShell将Windows store应用程序安装为开发者模式
原文: PowerShell将Windows store应用程序安装为开发者模式 在本地部署Windows 商店应用程序时,我们会遇到Add-AppDevPackage.ps1脚本,这个脚本和所在安装 ...
- C#判断是否相等
判断对象是否相等,因为平时用的一般都是int.bool.string类型的数据是否相等. 同时也是只判断它们的“值”是否相等.于是都是用“==”或是Equal()方法来判断. 但这并不能判断出是否为同 ...
- 使用Chart控件进行实时监控
Chart作为微软提供绘制图表的控件,在刚开始使用时非常的迷茫,因为功能强大,涉及到的知识多, 一开始难以接收过来,但后天经过查找资料,耐心学习,终于还是有了一定的收获. Chart相当于一个大的图纸 ...
- CheckSynchronize实现的不必要的复杂
在system.classes单元中,CheckSynchronize在ThreadLock上持续调用TMonitor的Exit和Enter以保护SyncList. 因为代码做的第一件事是换出Sync ...
- 10秒完成Linux系统pip在线安装
对于Python开发攻城狮及系统运维攻城狮来说,pip的安装那是必不可少的一个过程.鉴于网上很多安装过程写得过于复杂,本人根据pip官方手册总结了以下最为快捷的安装方式,只需要2步操作. curl h ...