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题,心里好开心>_<

  因为网上我找不到什么好的题解,所以我觉得最好我自己再写一篇虽然也不一定写得好其实主要还是我太弱了,看不懂

  首先,我们可以预处理出在没有任何限制的情况下的windy数。这里认为最高位是第$1$位,则可以令$dp_{i,j}$表示第$i$位填$j$的方案数,我从低位往高位转移,显然$$dp_{i,j}=\sum_{k=0}^{9} dp_{i+1,k}(| k-j| \ge 2)$$

  接下来,我们可以处理出$f_i$表示在第$i$位取该位最大值的方案数。设这个数第$i$位为$a_i$,则转移为$$f_i=\sum_{k=0}^{a_{i+1}-1} dp_{i+1,k}(| a_{i}-k| \ge 2)$$

  当然,如果$|a_{i+1}-a_i| \ge 2$ ,$f_i$还要加上$f_{i+1}$。

  然后,我们可以考虑如何统计答案。既然要求$[l,r]$之间的windy数个数,那么显然可以转为前缀和的差,也就是区间$[1,r]$的答案减去区间$[1,l-1]$的答案。

  那么,我们只需知道小于等于$x$的windy数个数即可。我们来考虑下。

  首先,我们可以先找到这个数第一个不为$0$的位置$w$。然后,这个位置显然可以放$1$到$a_w-1$,这部分的答案为$\sum_{i=1}^{a_{w}-1} dp_{w,i}$。然后,当这个位置放$a_w$时方案数就是$f_w$。

  接下来我们还要处理掉在位置$w$填$0$的情况。设这个数长度为$len$,我们只需再统计一下$\sum_{i=w+1}^{len} \sum_{j=1}^{9}dp_{i,j}$就可以了。

  下面是代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define INF 2147483647 using namespace std;
typedef long long llg; int a[][],g[][],n,ans,x,y,z;
int f[]; void init(int x){
int now=,ww=;
while(!a[x][ww] && ww<=n) ww++;
memset(g,,sizeof(g));
memset(f,,sizeof(f)); f[n]=;
for(int i=;i<=;i++) g[n][i]=;
for(int i=n-;i;i--){
for(int j=;j<=;j++)
for(int k=;k<=;k++)
if(abs(j-k)>=) g[i][j]+=g[i+][k];
for(int j=;j<a[x][i+];j++)
if(abs(a[x][i]-j)>=) f[i]+=g[i+][j];
if(abs(a[x][i]-a[x][i+])>=) f[i]+=f[i+];
}
for(int i=ww+;i<=n;i++)
for(int j=;j<=;j++) now+=g[i][j];
if(ww<=n){
for(int i=;i<a[x][ww];i++) now+=g[ww][i];
now+=f[ww];
}
if(x) ans+=now; else ans-=now;
} int main(){
File("a");
scanf("%d %d",&x,&y);
x--;z=y; while(z) n++,z/=;
for(int i=n;i;i--){
a[][i]=x%,x/=;
a[][i]=y%,y/=;
}
init(); init();
printf("%d",ans);
return ;
}

BZOJ 1026 【SCOI2009】 windy数的更多相关文章

  1. bzoj 1026 [SCOI2009]windy数 数位dp

    1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  2. bzoj 1026 [SCOI2009]windy数(数位DP)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Sta ...

  3. BZOJ 1026: [SCOI2009]windy数( dp )

    dp..dp(x, t) 表示共x位, 第x位为t有多少个windy数. 对答案差分, 我们只需统计1 ~ l-1和1 ~ r的windy数数量. 考虑如何计算[1, n]的答案 : 从最高位到最低位 ...

  4. bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...

  5. BZOJ 1026: [SCOI2009]windy数 【数位dp】

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...

  6. bzoj 1026: [SCOI2009]windy数 & 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  7. BZOJ 1026: [SCOI2009]windy数

    题目 人生中的第一道数位dp,很有趣,虽然我很快推出了结构,但是过程却迟迟没有写出来,最后看别人的题解才恍然大悟 d[i][j]表示数位为i,最高位为j的方案数 DpInit非常简单,复杂度应该是O( ...

  8. bzoj 1026: [SCOI2009]windy数【数位dp】

    忘记limit不能记WA了一发-- 典型数位dp,变成work(r)-work(l-1),然后dfs的时候记录w当前位置,la上一个数选的什么,lm当前位是否有上限,ok当前位是否可以不考虑差大于等于 ...

  9. bzoj 1026 [SCOI2009]windy数——数位dp水题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #in ...

  10. 数位DP BZOJ 1026 [SCOI2009]windy数

    题目链接 前面全是0的情况特判 #include <bits/stdc++.h> int dp[10][10]; int digit[10]; int DFS(int pos, int v ...

随机推荐

  1. UI入门指引

    1. iOS学习路线: C语言:数据类型.流程控制.函数.指针.字符串.结构体.枚举.预处理: OC:面向对象.内存管理.分类.协议.Block.KVC/KVO.Foundation框架: iOS基础 ...

  2. Lambda 表达式(C# 编程指南) 微软microsoft官方说明

    Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...

  3. 安装centos 7后恢复windows 2008R2 (Windows7)启动项

    安装CentOS 7,安装之后发现Win2008R2的启动项不见了(Windows7同理).一般安装Linux过程中会自动识别windows系统并添加引导项,centos的问题在于默认不支持ntfs分 ...

  4. Java字符串中常见的10个问题

    下面是Java中10个最常见的关于字符串的问题. 怎样比较字符串?使用==还是equals() 简单的说,“==”用于判断引用是否相等,equals()用于判断值是否相等.除非你要比较两个字符串是否是 ...

  5. JavaScript(一)——简介(简单介绍)

    1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司(已被Oracle收购了),J ...

  6. Javascript之旅——第四站:parseInt中要注意的坑

    前些天信用卡站点要接入一个新功能,不过还真比较坑爹,asp站点,大家都知道信用卡的背面是有一个有效期的,在对接银行中这个信息 一定是要传给银行做数据校验,用户在语音输入信用卡有效期后,系统会做一个有效 ...

  7. MySQL基础学习(二) 常用SQL命令

    一. 1. select version();  查看数据库版本 2. select user(); 查看当前用户 3. select now(); 查看当前时间 4. show databases; ...

  8. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  9. WcfDataService with EntityFramework 6 的若干问题

    1.Microsoft.Data.Edm等NuGet包需要升级到5.6版本 2.SVC不要使用DataService基类 class WcfDataService1 : DataService< ...

  10. AI(Adobe Illustrator)简单入门——米老鼠

    成果: 步骤如下: 一.新建文档 二.选椭圆工具,在画布中间点一下,画一个100px*100px的圆,如下 三.同上,再画两个50px*50px小圆.点左上角的选择工具,点小圆中心,放好位置. 四.全 ...