BZOJ_1026_[SCOI2009]_windy数_(数位dp)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1026
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
分析
我们用\(dp[i][j]\)表示以\(j\)开头的\(i\)为数中windy数一共有多少.
然后用\(solve(x)\)求出\([1,x]\)内的windy数一共有多少,步骤如下:
1.将\(x\)一位一位拆开,共\(cnt\)位,第\(i\)位为\(num[i]\).
2.统计以\(1,2,3,...,9\)开头的\(i\)位数中共有多少windy数,其中\(i<cnt\).
3.对于\(cnt\)位数,显然我们是不能把\(dp[cnt][num[cnt]\)加进去的.比如\(x=5786\),以\(5\)开头的\(4\)位数没有完全包含,所以只能从\(dp[cnt][1]\)计算到\(dp[cnt][num[cnt]-1]\),然后对于第\(cnt\)位为\(num[cnt]\)的,就到\(cnt-1\)位去计算.(相当于数钱,一共5786,数到4999,不能直接数5999,对于>=5000的,要从百位开始数了).
4.依次往后退,但是注意,当\(num[i]\)与\(num[i+1]\)相差不到\(2\)的话,对于第\(i\)位是\(num[i]\)的情况就不需要考虑了,也就不用继续下去了.
5.由于第\(cnt\)位不能取\(0\),而只有最后一位可以去\(num[i]\),比较特殊,所以需要单独处理,可以特判一位数的情况,确保至少有最高位和最低位两个不同的位.
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
int num[];
ll dp[][];
ll a,b;
inline ll read(ll &x){ x=;ll k=-;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*k; }
ll solve(int x){
if(x<) return x;
ll ans=; int cnt=;
while(x) num[++cnt]=x%, x/=;
for(int i=;i<cnt;i++) ans+=dp[i][]-dp[i][];
for(int i=;i<num[cnt];i++) ans+=dp[cnt][i];
for(int i=cnt-;i;i--){
for(int j=;j<num[i];j++)if(abs(num[i+]-j)>)
ans+=dp[i][j];
if(i==&&abs(num[i+]-num[i])>) ans++;
if(abs(num[i+]-num[i])<=) break;
}
return ans;
}
int main(){
read(a); read(b);
for(int i=;i<;i++) dp[][i]=;
dp[][]=;
for(int i=;i<=;i++)for(int j=;j<;j++){
for(int k=;k<;k++)if(abs(j-k)>)
dp[i][j]+=dp[i-][k];
dp[i][]+=dp[i][j];
}
printf("%lld\n",solve(b)-solve(a-));
}
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 5441 Solved: 2450
[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 。
Source
BZOJ_1026_[SCOI2009]_windy数_(数位dp)的更多相关文章
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- [bzoj1026][SCOI2009]windy数_数位dp
windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...
- BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP
BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- bzoj1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8203 Solved: 3687[Submit][Sta ...
- 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...
- 【BZOJ】1026: [SCOI2009]windy数(数位dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1026 我果然很弱啊... 考虑数位dp.枚举每一位,然后限制下一位即可. 一定要注意啊!在dfs的时 ...
- 1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9016 Solved: 4085[Submit][Sta ...
- 1026. [SCOI2009]windy数【数位DP】
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? I ...
随机推荐
- [技术翻译] 构建现代化的Objective-C (下)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3563880.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- POJ 2559 Largest Rectangle in a Histogram -- 动态规划
题目地址:http://poj.org/problem?id=2559 Description A histogram is a polygon composed of a sequence of r ...
- 九度OJ1198 a+b 【高精度整数】
题目地址:http://ac.jobdu.com/problem.php?pid=1198 题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1 ...
- 使用json方式实现省市两级下拉级联菜单[原创]
本文为博主原创,转载请注明. 首先看一下实现后的效果图: 当然,要完成这个实验,mysql必须与数据库连接,这里选用navicat for mysql这款软件,它与mysql的契合度是很高的,配置环境 ...
- Linux C 程序 基础语法(1)
1.Linux 下第一支C程序,控制台打印一句话. vi first.c //linux新建文件 #include<stdio.h> int main() { printf("w ...
- 【转】C# Excel 导入到 Access数据库表(winForm版)
/// <summary> /// 获取Excel文件 /// </summary> /// <param name="sender">< ...
- "严格模式" use strict 详解
一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...
- std::string和int类型的相互转换(C/C++)
字符串和数值之前转换,是一个经常碰到的类型转换. 之前字符数组用的多,std::string的这次用到了,还是有点区别,这里提供C++和C的两种方式供参考: 优缺点:C++的stringstream智 ...
- 第四章 Web表单
4.1 跨站请求伪造保护 安装flask-wtf app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' 密钥不 ...
- 2016030206 - mysql常用命令
参考地址如下: http://www.cnblogs.com/linjiqin/archive/2013/03/01/2939384.html http://www.cnblogs.com/zhang ...