数位dp之前完全没接触过,所以NOIP之前搞一下。数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关

在这道题中,dp[i][j]代表考虑了i位前一位为j,然后进行转移就好。主要是需要考虑前导零和前一位是否为极限。

题干:

  1. windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在AB之间,包括AB,总共有多少个windy数?
  2. 输入输出格式
  3. 输入格式:
  4. 包含两个整数,A B
  5. 输出格式:
  6. 一个整数
  7. 输入输出样例
  8. 输入样例#: 复制
  9.  
  10. 输出样例#: 复制
  11.  
  12. 输入样例#: 复制
  13.  
  14. 输出样例#: 复制

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<ctime>
  5. #include<queue>
  6. #include<algorithm>
  7. #include<cstring>
  8. using namespace std;
  9. #define duke(i,a,n) for(register int i = a;i <= n;i++)
  10. #define lv(i,a,n) for(register int i = a;i >= n;i--)
  11. #define clean(a) memset(a,0,sizeof(a))
  12. const int INF = << ;
  13. typedef long long ll;
  14. typedef double db;
  15. template <class T>
  16. void read(T &x)
  17. {
  18. char c;
  19. bool op = ;
  20. while(c = getchar(), c < '' || c > '')
  21. if(c == '-') op = ;
  22. x = c - '';
  23. while(c = getchar(), c >= '' && c <= '')
  24. x = x * + c - '';
  25. if(op) x = -x;
  26. }
  27. template <class T>
  28. void write(T x)
  29. {
  30. if(x < ) putchar('-'), x = -x;
  31. if(x >= ) write(x / );
  32. putchar('' + x % );
  33. }
  34. int dp[][],num[],a,b;
  35. int dfs(int len,int lst,bool sx,bool qd)
  36. {
  37. if(len == ) return ;
  38. if(!qd && !sx && dp[len][lst] != -)
  39. {
  40. return dp[len][lst];
  41. }
  42. int p,cnt = ,maxx = (sx ? num[len] : );
  43. for(int i = ;i <= maxx;i++)
  44. {
  45. if(abs(i - lst) < ) continue;
  46. p = i;
  47. if(qd && i == ) p = -;
  48. cnt += dfs(len - ,p,sx && (i == maxx),(p == -));
  49. }
  50. if(!sx && !qd) dp[len][lst] = cnt;
  51. return cnt;
  52. }
  53. int solve(int x)
  54. {
  55. int k = ;
  56. while(x)
  57. {
  58. num[++k] = x % ;
  59. x /= ;
  60. }
  61. memset(dp,-,sizeof(dp));
  62. return dfs(k,-,true,true);
  63. }
  64. int main()
  65. {
  66. read(a);read(b);
  67. printf("%d\n",solve(b) - solve(a - ));
  68. return ;
  69. }

P2657 [SCOI2009]windy数 数位dp的更多相关文章

  1. luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索

    题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...

  2. 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]

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

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

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

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

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

  5. BZOJ1026: [SCOI2009]windy数[数位DP]

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

  6. 【bzoj1026】[SCOI2009]windy数 数位dp

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

  7. [bzoj1026][SCOI2009]windy数——数位dp

    题目 求[a,b]中的windy数个数. windy数指的是任意相邻两个数位上的数至少相差2的数,比如135是,134不是. 题解 感觉这个题比刚才做的那个简单多了...这个才真的应该是数位dp入门题 ...

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

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

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

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

随机推荐

  1. TWaver MONO模板库新鲜出炉 精彩纷呈

    MONO Design在线3D建模平台网站, www.mono-design.cn,开发组的成员们已经开始紧锣密鼓的对这个平台进行内测.在之前的文章里,我们提到用户可以获得多种多样的TWaver官方模 ...

  2. linux的ssh相关指令

    1.安装ssh apt-get install openssh-server 2.备份ssh的配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_confi ...

  3. linux less-分屏上下翻页浏览文件内容

    博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more ...

  4. 【03】AngularJS 简介

    AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML ...

  5. 【Codeforces 567D】One-Dimensional Battle Ships

    [链接] 我是链接,点我呀:) [题意] 长度为n的一个序列,其中有一些部分可能是空的,一些部分是长度为a的物品的一部分 (总共有k个长度为a的物品,一个放在位置i长度为a的物品会占据i,i+1,.. ...

  6. Java并发编程:线程池 - 实例

    代码块: public class test { public static void main(String[] args) { test t = new test(); ThreadPoolExe ...

  7. 在JQuery中$(document.body)和这个$("body") 这两的区别在哪里?

    两种写法代表的是同一个对象 $("body") 是一个选择器,jQuery 会从 DOM 顶端开始搜索,直到找到标签为 body 的元素. 而 $(document.body) 中 ...

  8. Luogu P1257 平面上的最接近点对 暴力

    这道题数据不大 两点距离用勾股定理求 #include<iostream> #include<cmath> using namespace std; struct node{ ...

  9. 20181010关于pt-kill自动杀死运行超长的进程

    转自: http://blog.chinaunix.net/uid-16844903-id-4442030.htmlhttp://blog.chinaunix.net/uid-31396856-id- ...

  10. 将list转为json字符串

    //确保JSP和servlet的编码方式一致 resp.setContentType("text/html;charset=GBK"); List<String> jy ...