[bzoj1026][SCOI2009]windy数_数位dp
windy数 bzoj-1026
题目大意:求一段区间中的windy数个数。
注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0。$区间边界<=2\cdot 10^9$。
想法:数位dp裸题,何为数位dp?
数位dp的意思就是我们交换一种dp的方式。通过数位进行dp。数位dp的主旨分为两点:1.对于所求答案的预处理。2.对于所求区间的边界特判。我们对于数位dp有几个显而易见但是却比较useful的性质:
如果一个数的位数小于第二个数的位数,那么后者是大于前者的。
如果两个数的位数相等且前者的最高位是小于后者的最高位的,那么后者是大于前者的。
如果将两个数同时加减同一个数,他们之间的大小关系显然是不变的。
通过以上几个性质,我们在枚举边界时可以先将位数小的全部枚举,然后对于高位到低位依次dp。
回到这道题,我们先设状态dp[i][j]表示i位数且最高位为j。在转移时,我们其实很容易想到
$\sum\limits_{k=0}^{9}dp(i-1,k)\cdot [|j-k|\ge 2]$
之后,关于边界的处理,看代码... ...
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;
int f[20][20];
void before_hand()//这个是预处理,在上面说的很清楚了
{
memset(f,0,sizeof f);
for(int i=0;i<=9;i++) f[1][i]=1;
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];
}
}
int dig[20];
ll dispose(ll x)//对边界的处理
{
int ans=0;
int k=0;
memset(dig,0,sizeof dig);
if(!x) return 0;
while(x)
{
dig[++k]=x%10;
x/=10;
}
for(int i=1;i<=k-1;i++) for(int j=1;j<=9;j++)//我们用给出的第一条性质,发现
ans+=f[i][j];//ans这时一定是被所求答案覆盖的
for(int i=1;i<dig[k];i++)//第二个性质
ans+=f[k][i];
for(int i=k-1;i>=1;i--)//反复运用第二、三个性质
{
for(int j=0;j<dig[i];j++)
{
if(abs(j-dig[i+1])>=2) ans+=f[i][j];
}
if(abs(dig[i+1]-dig[i])<2) break;
if(i==1) ans++;
}
return ans;
}
int main()
{
ll l,r;
scanf("%lld%lld",&l,&r);
before_hand();
printf("%lld\n",dispose(r)-dispose(l-1));
return 0;
}
小结:前面预处理的边界不要忘记特判。数位dp的第一道题,加油,JZYshuraK
[bzoj1026][SCOI2009]windy数_数位dp的更多相关文章
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- 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 ...
- 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)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- 1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9016 Solved: 4085[Submit][Sta ...
- BZOJ_1026_[SCOI2009]_windy数_(数位dp)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1026 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为wi ...
- 【BZOJ】1026: [SCOI2009]windy数(数位dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1026 我果然很弱啊... 考虑数位dp.枚举每一位,然后限制下一位即可. 一定要注意啊!在dfs的时 ...
- 1026. [SCOI2009]windy数【数位DP】
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? I ...
随机推荐
- WIN7 嵌入式系统安装教程 Windows Embedded Standard 2011 安装
轻松构建你的第一个 Windows Embedded Standard 2011 镜像.通过本文你可以快速掌握如何使用Windows Embedded Standard 2011 CTP1 来构建一个 ...
- Android APP开发入门教程-Button
代码编写 做好准备工作后,终于可以开始写我们的hello android了,在开始编写代码之前,我们先了解几个文件: res/layout/main.xml App主窗体布局文件,你的应用长什么样都在 ...
- QOpenGLTexture 两个纹理叠加
如何做纹理混合? 方法是,定义多个QOpenGLTexture,然后在fragment shader中添加相应的变量,然后把texture bind到对应的uniform变量上. 废话不多说 text ...
- 利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...
- jquery回调函数的一个案例
1.引言 今天在学习<jQuery基础教程>在学习编写插件的时候,书中说利用回调函数来当参数,会极大的提高程序的灵活性.对回调函数很陌生.研究了一下给的示例程序.感觉对回调函数有了基本的了 ...
- 动态添加弹出页面(shiro项目中来的七)
一,图解 二,代码 2.0,新增代码 //打开编辑属性(新增) function dialog_open(){ $("#dialog-add").css("display ...
- 一篇文章看懂Java并发和线程安全
一.前言 长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章. 二.导读 1.为什 ...
- Luogu P1410 子序列
题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...
- 【BZOJ2809】【APIO2012】Dispatching(左偏树)
题面 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个 ...
- 8Manage:物流CRM,深度挖掘快递企业下一站蓝海!
[导读]网购的普及加快了快递物流服务在中国的发展,而物流行业也开始展露出自身巨大的发展潜力和进步空间.其中,作为物流行业根本核心的物流客户关系管理开始引起了管理者的注意,如何升级用户物流服务体验,把握 ...