bzoj1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 8203 Solved: 3687
[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 。
题解
第一次做数位dp的题(从1662滚过来)
这道题也算是挺裸的一道数位dp 只需要记录上一位就可以判断是否合法
状态转移方程:令f[i][j]表示前i位,最高位为j的方案数
f[i][j]=sum(f[i-1][k]) if(k-j>=2)
代码大体是照着 http://www.cnblogs.com/zbtrs/p/6105338.html 打的 我觉得讲的非常棒
对于几个可能不太好理解的位置我加了一点注释
/**************************************************************
Problem: 1026
User: a799091501
Language: C++
Result: Accepted
Time:0 ms
Memory:1292 kb
****************************************************************/
#pragma GCC optimize("O2")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<limits.h>
#include<ctime>
#define N 100001
typedef
long
long
ll;
const
int
inf=999999999;
const
int
maxn=2017;
using
namespace
std;
ll f[20][20],num[20];
inline
int
read()
{
int
f=1,x=0;
char
ch=
getchar
();
while
(ch>
'9'
|ch<
'0'
)
{
if
(ch==
'-'
)
f=-1;
ch=
getchar
();
}
while
(ch<=
'9'
&&ch>=
'0'
)
{
x=(x<<3)+(x<<1)+ch-
'0'
;
ch=
getchar
();
}
return
f*x;
}
void
init()
{
memset
(f,0,
sizeof
(f));
for
(
int
i=0;i<=9;i++)
f[1][i]=1;
//第一位所有数都是windy数
for
(
int
i=2;i<=10;i++)
for
(
int
j=0;j<=9;j++)
for
(
int
k=0;k<=9;k++)
if
(
abs
(j-k)>=2) f[i][j]+=f[i-1][k];
//第i位最高位为j的状态可以从每一个符合条件的i-1位最高位为k转移而来
}
ll solve(ll x)
{
memset
(num,0,
sizeof
(num));
if
(x==0)
return
0;
ll pos=0,ans=0;
while
(x)
{
num[++pos]=x%10;
x/=10;
}
for
(
int
i=1;i<pos;i++)
for
(
int
j=1;j<=9;j++)
//不含前导零,因此从1开始枚举
ans+=f[i][j];
for
(
int
i=1;i<num[pos];i++)
ans+=f[pos][i];
for
(
int
i=pos-1;i>=1;i--)
{
for
(
int
j=0;j<num[i];j++)
//枚举最高位的所有状态
if
(
abs
(j-num[i+1])>=2)
//上一位
ans+=f[i][j];
if
(
abs
(num[i+1]-num[i])<2)
break
;
//后面的答案不可能有贡献,跳出
if
(i==1)ans+=1;
}
return
ans;
}
int
main()
{
int
a=read(),b=read();
init();
cout<<solve(b)-solve(a-1);
}
bzoj1026: [SCOI2009]windy数(数位dp)的更多相关文章
- BZOJ1026: [SCOI2009]windy数[数位DP]
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6346 Solved: 2831[Submit][Sta ...
- [bzoj1026][SCOI2009]windy数——数位dp
题目 求[a,b]中的windy数个数. windy数指的是任意相邻两个数位上的数至少相差2的数,比如135是,134不是. 题解 感觉这个题比刚才做的那个简单多了...这个才真的应该是数位dp入门题 ...
- HDU2089 不要62 BZOJ1026: [SCOI2009]windy数 [数位DP]
基础题复习 这次用了dfs写法,感觉比较好 #include <iostream> #include <cstdio> #include <cstring> #in ...
- 【BZOJ-1026】windy数 数位DP
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5230 Solved: 2353[Submit][Sta ...
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- 【bzoj1026】[SCOI2009]windy数 数位dp
题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...
- 题解 BZOJ1026 & luogu P2657 [SCOI2009]windy数 数位DP
BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...
- 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]
题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...
- P2657 [SCOI2009]windy数 数位dp
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...
随机推荐
- 2019-3-9,Servlet转跳链接详解
//以下代码,可以传递request和response对象及其属性和变量至指定页面 request.getRequestDispatcher("showAttribut.jsp") ...
- SVN_2008R2 搭建流程与规范
Svn服务在win2008 搭建 1:svn服务的原理与架构 1.Svn服务可以理解为加强版的ftp文件服务器, svn采用HTTP协议的方式进行文件传输 2.服务端安装好后,普通用户也需要下载一个c ...
- python requests 正则爬虫
代码: import requests from multiprocessing import Pool from requests.exceptions import RequestExceptio ...
- (原创)C# 压缩解压那些事儿
吐槽: 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗的太垃圾了,获取下来的压缩包使用正常方式无法解压!!没有专门的API ...
- JavaScript动态加载CSS和JS文件
var dynamicLoading = { css: function(path){ if(!path || path.length === 0){ throw new Error('argumen ...
- 铺放骨牌 uva11270
题解: 插头dp裸题 没什么好说的啊就是n个二进制位表示状态 相比原先就是用2n个二进制位表示状态 蓝书上后面几题插头dp都挺烦的啊... 代码:
- Derive representation formula from Green’s identity
This article introduces how to derive the representation formula used in BEM from Green's identity. ...
- AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...
- 防止vs编译时自动启动单元测试
Tools → Options → Live Unit Testing Pause 勾选
- oracle中查询条件包含null时
不能使用=null或者!=null 应该使用is null和is not null