题目描述

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

输入

包含两个整数,A B。

输出

一个整数,表示答案

样例输入

【输入样例一】
1 10
【输入样例二】
25 50

样例输出

【输出样例一】
9
【输出样例二】
20


题解

数位dp

快联赛了重写了一下,发现以前写的太傻逼了= =

由于加一个数位的贡献只与最高位有关,因此设 $f[i][j]$ 表示 $i$ 位数,最高位为 $j$ 的数的个数。

那么显然可以得到 $f[i][j]=\sum\limits_{|j-k|\le 2}f[i-1][k]$ 。

预处理出 $f$ 数组后即可进行数位dp。

先把位数不满的算上,然后再从高位到低位把该位不满的加入答案中。

此时需要记录上一个数位是什么,在枚举当前数位时需要满足当前位的条件。并且如果上一个与当前数位产生冲突则不再有满足条件的数,应当跳出循环。

把询问区间转化为 $[1,n)$ 的半开半闭区间更容易处理一些。

代码中为了避免一些细节(比如最高位只能处理到 $2*10^9$ 之类的),开了long long。

#include <cstdio>
typedef long long ll;
ll f[11][10] , b[11];
inline int abs(int x)
{return x > 0 ? x : -x;
}
void init()
{int i , j , k;b[0] = 1 , b[1] = 10;for(i = 0 ; i < 10 ; i ++ ) f[1][i] = 1;for(i = 2 ; i < 11 ; i ++ ){b[i] = b[i - 1] * 10;for(j = 0 ; j < 10 ; j ++ )for(k = 0 ; k < 10 ; k ++ )if(abs(j - k) >= 2)f[i][j] += f[i - 1][k];}
}
ll calc(ll n)
{int i , j , last = -1 , di = 1;ll ans = 0;for(i = 1 ; b[i] <= n ; i ++ )for(j = 1 ; j < 10 ; j ++ )ans += f[i][j];for( ; i ; i -- ){for(j = di ; j < n / b[i - 1] % 10 ; j ++ )if(abs(j - last) >= 2)ans += f[i][j];if(abs(n / b[i - 1] % 10 - last) < 2) break;last = n / b[i - 1] % 10 , di = 0;}return ans;
}
int main()
{init();ll n , m;scanf("%lld%lld" , &n , &m);printf("%lld\n" , calc(m + 1) - calc(n));return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7811439.html

【bzoj1026】[SCOI2009]windy数 数位dp相关推荐

  1. BZOJ1026 [SCOI2009]windy数 数位dp

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1026 题目概括 求区间[A,B]中有多少数满足下面的条件. 条件:该数相邻两位之差不小于2. 题解 ...

  2. BZOJ1026: [SCOI2009]windy数(数位dp)

    题意 题目链接 Sol 很zz的数位dp $f[i][j]$表示第$i$位,前一位是$j$的方案数 转移的时候枚举一下是否相同即可 注意当lim达到上界的时候是不能记忆化的! /**/ #includ ...

  3. [BZOJ1026] [SCOI2009] windy数 (数位dp)

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

  4. 洛谷 P2657 [SCOI2009] windy数 数位DP

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...

  5. 题解 BZOJ1026 luogu P2657 [SCOI2009]windy数 数位DP

    BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...

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

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

  7. P2657 [SCOI2009]windy数(数位dp)

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

  8. P2657 [SCOI2009]windy数 数位dp入门

    参考了题解,理解仍然还不够透彻 #include<bits/stdc++.h> using namespace std; const int N=550; const int maxn=1 ...

  9. BZOJ1026[SCOI2009]windy数

    @(BZOJ)[数位DP] 题面 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B ...

最新文章

  1. 频繁模式(frequent pattern)
  2. 题目1207:质因数的个数
  3. 实战SSM_O2O商铺_46【Redis缓存】头条信息+商铺目录Service层加入缓存
  4. boost::mp11::mp_map_erase相关用法的测试程序
  5. commons-lang3:ArrayUtils
  6. 每日一笑 | 今天是植树节,我想在你心里种点逼树
  7. mime类型是什么类型_使用多种MIME类型测试REST
  8. Linux基本目录结构
  9. c++折线平移算法_RSA笔记-蒙哥马利算法(1)
  10. 【数字全排列】LeetCode 46. Permutations
  11. CCNA自学教材推荐(转)
  12. 程序批量将文本文件中的某字符替换
  13. 地理信息安全在线培训考试系统题库-多选题
  14. 神奇的量子世界——量子纠缠(Matlab实现)
  15. 安卓:点击空白处隐藏软键盘
  16. ISP图像调试之关于海思平台下的3DNR降噪中各个参数模块的一些总结
  17. OpenStack裸金属使用总结
  18. 解决Windows10开机黑屏问题
  19. rust: 引用第三方库(Cargo.toml、Cargo.lock文件)
  20. 江苏省高等学校计算机一级成绩查询,江苏计算机等级考试成绩查询入口

热门文章

  1. 【译】 Sparky: A Lightning Network in Two Pages of Solidity
  2. libnghttp2 NDK 交叉编译
  3. 【附代码】如何在私有链上编写、部署与以太坊进行交互的智能合约
  4. Activity到底是什么时候显示到屏幕上的呢
  5. 【问链财经-区块链基础知识系列】 第四十六课 区块链如何作用于医药行业
  6. mysql的多master调度_innodb中master线程的调度的算法改进(mysql 5.6.26)
  7. Qt中qDebug()技巧初探
  8. 大学计算机二级考试 vb,大学计算机二级考试常用vb代码.docx
  9. 均分纸牌pascal程序
  10. 【学习笔记】求解简单递归式的一般方法