最近学习了一下数位DP

感觉记忆化搜索是比较好理解的

这篇博客对我有一定的启发https://www.cnblogs.com/zbtrs/p/6106783.html

总结了一下:
 
 用数位DP的题目:
 
 形如“问在x到y的整数中满足性质……的数的个数”
 
套路:
main函数一般是这样的
 
 

设max为上限值,即我们要统计 max之前的满足性质的数的个数
为了使搜到的数都满足 x<max
 所以我们在搜索时定义一个bool型变量shangxian,表示搜到当前数位时前面的数位是否是沿着上限值
 例如:上限max为54123
 第一位时shangxian=true 搜0,1,2,3,4,5
 若第一位搜到了0,1,2,3,4,下一位shangxian=false
 若第一位搜到了5,下一位shangxian=true
 若shangxian=false 该位枚举0~9,且向下递归时shangxian一直为false
 若shangxian=true  该位枚举0~max[i],当该位搜到max[i]时,下一位shangxian=true,否则
 Shangxian=false

windy数

显然这是一道数位DP的题

要注意的地方是前导全零时的状态转移

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define abs(i) ((i)>0?(i):(-i))
int a,b,maxx[],dp[][];  //dp[i][j]前i位 第i-1位是j的方案数
int dfs(int len,int lastnum,bool shangxian,bool O){
if(len==) return O^;
if(!shangxian&&dp[len][lastnum])
return dp[len][lastnum];
int cnt=,M=shangxian?maxx[len]:;
for(int i=;i<=M;i++){
if(!O&&abs(lastnum-i)<) continue;    //前面都是前导0,该位不受其限制
cnt+=dfs(len-,i,shangxian&&i==M,O&&i==);
}
if(!shangxian&&!O) dp[len][lastnum]=cnt;  //前面都是前导0,不会限制到下一位,不能记忆化
return cnt;
}
int solve(int x){
memset(maxx,,sizeof(maxx));
memset(dp,,sizeof(dp));    //注意要清空数组
int k=;
while(x){
maxx[++k]=x%;
x/=;
}
return dfs(k,-,,);
}
int main()
{
scanf("%d%d",&a,&b);
printf("%d",solve(b)-solve(a-));
return ;
}

【洛谷P2657】[SCOI2009] windy数的更多相关文章

  1. 洛谷 P2657 [SCOI2009]windy数 解题报告

    P2657 [SCOI2009]windy数 题目描述 \(\tt{windy}\)定义了一种\(\tt{windy}\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(\tt{wi ...

  2. 洛谷——P2657 [SCOI2009]windy数

    P2657 [SCOI2009]windy数 题目大意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和 ...

  3. C++ 洛谷 P2657 [SCOI2009]windy数 题解

    P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...

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

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

  5. [洛谷P2657][SCOI2009]windy数

    题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0 ...

  6. 洛谷P2657 [SCOI2009]windy数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分 ...

  7. 洛谷 P2657 [SCOI2009]windy数

    题意简述 求l~r之间不含前导零且相邻两个数字之差至少为2的正整数的个数 题解思路 数位DP 代码 #include <cstdio> #include <cstring> # ...

  8. BZOJ1026或洛谷2657 [SCOI2009]windy数

    BZOJ原题链接 洛谷原题链接 简单的数位\(DP\),套模板就好. #include<cstdio> #include<cstring> using namespace st ...

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

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

  10. P2657 [SCOI2009]windy数

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

随机推荐

  1. GitHub+Hexo+gulp搭建博客网站

    一.前期准备 1.注册GitHub账号. 不做说明 2.创建仓库 创建一个新的仓库来放置我们的文件. 3.下载安装Node.js https://nodejs.org/en/   两个版本,选择右边那 ...

  2. 关于重定向printf出错 Error[Pe020]: identifier "FILE" is undefined 解决方案

    IAR或者Keil用到重定向printf函数出现的错误解决方案 转发请注明出处,谢谢 原创:李剀 https://www.cnblogs.com/kevin-nancy/articles/105851 ...

  3. Unity中Shader和AssetBundle结合使用的注意事项

    之前遇到了一件事情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本 下面是unity开发的一些 ...

  4. C++ Memory System Part3 : 优化

    前面的系列我们讲了自定义new和delete操作,其中针对deleteArray的问题还有需要优化的地方.我们这次就针对POD类型进行一次优化. 下面的代码是针对POD类型的模板函数实现,分别为New ...

  5. [Scala] Pattern Matching(模式匹配)

    Scala中的match, 比起以往使用的switch-case有著更強大的功能, 1. 傳統方法 def toYesOrNo(choice: Int): String = choice match ...

  6. jQuery中的事件——《锋利的JQuery》

    虽然利用原生的JavaScript事件能完成一些交互,但jQuery增加并扩展了基本的事件处理机制.jQuery不仅提供了更加优雅的事件处理语法,而且极大地增强了事件处理能力. 1.加载DOM 在Ja ...

  7. 【Shell】shell的运算

    一.除法 a=12 b=7 1) expr $a / $b  计算出结果为个1 ,只支持整除 2) echo "scale=2;$a/$b" | bc结果为 1.71 3) awk ...

  8. Javascript模块化编程(三)require.js的用法及功能介绍

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战.我采用的是一个非常流行的库require.js感兴趣的朋友可以了解下啊 我采用的是一个非常流行的 ...

  9. select操作大全

    每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...

  10. javaSE练习1——变量和运算符

    一.已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序.(知识点:变量和运算符综合应用): package com.test; public class t01 { public stati ...