Code1 (DP版)

#include<bits/stdc++.h>
#define in(i) (i=read())
using namespace std;
int read()
{
int ans=0,f=1;
char i=getchar();
while(i<'0' || i>'9') {
if(i=='-') f=-1;
i=getchar();
}
while(i>='0' && i<='9') {
ans=(ans<<1)+(ans<<3)+i-'0';
i=getchar();
}return ans*f;
}
int dp[12][10],bit[10]; void init()
{
for(int i=0;i<=9;i++) dp[1][i]=1;
for(int i=2;i<=10;i++) {
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
}
} int solve(int x)
{
if(x==0) return 0; int ans=0,len=0;
memset(bit,0,sizeof(bit));
while(x) {
bit[++len]=x%10;
x/=10;
}
for(int i=1;i<=len-1;i++)
for(int j=1;j<=9;j++)
ans+=dp[i][j];
for(int i=1;i<bit[len];i++) ans+=dp[len][i];
for(int i=len-1;i>=1;i--) {
for(int j=0;j<bit[i];j++)
if(abs(bit[i+1]-j)>=2) ans+=dp[i][j];
if(abs(bit[i+1]-bit[i])<2) break;
if(i==1) ans++;
}return ans;
}
int main()
{
init(); int a,b;
in(a);in(b);
cout<<solve(b)-solve(a-1)<<endl;
}

Code2(记忆化搜索版)

#include<bits/stdc++.h>
#define in(i) (i=read())
using namespace std;
int read()
{
int ans=0,f=1;
char i=getchar();
while(i<'0' || i>'9') {
if(i=='-') f=-1;
i=getchar();
}
while(i>='0' && i<='9') {
ans=(ans<<1)+(ans<<3)+i-'0';
i=getchar();
}return ans*f;
}
int bit[11], dp[11][10];
int dfs(int len,int pre,int f,int limit)
{
int ans=0;
if(!len) return 1;
if(!limit && f && dp[len][pre]) return dp[len][pre];
int maxn=limit?bit[len]:9;
for(int i=0;i<=maxn;i++)
{
if(abs(i-pre)>=2) {
int p=i;
if(pre==-10 && !i) p=pre;
ans+=dfs(len-1,p,f||i!=0,limit && i==maxn);
}
}
if(!limit && f) dp[len][pre]=ans;
return ans;
}
int solve(int a)
{
memset(bit,0,sizeof(bit));
int k=0;
while(a) {
bit[++k]=a%10;
a/=10;
}return dfs(k,-10,0,1);
}
int main()
{
int a,b;
in(a);in(b);
cout<<solve(b)-solve(a-1)<<endl;
return 0;
}

[SCOI2009]windy数 代码 (对应数位dp入门)的更多相关文章

  1. [BZOJ1026][SCOI2009]windy数 解题报告|数位dp

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

  2. 数位dp入门(内容一样,新版格式)

    顾名思义,数位dp,是一种用来计数的dp,就是把一个数字拆成一个一个数位去统计 如果现在给你一道题,需要你求在区间[l,r]内满足条件的解的个数,我们很容易想到去暴力枚举,但要是数据范围太大这种办法就 ...

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

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

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

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

  5. BZOJ_1026_[SCOI2009]windy数_数位DP

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

  6. bzoj1026: [SCOI2009]windy数(数位dp)

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

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

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

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

    1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...

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

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

随机推荐

  1. java 序列化和反序列化的底层实现原理

    出处:序列化和反序列化的底层实现原理是什么? 一.基本概念1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过 ...

  2. less的引用及公共变量的抽离

    一.什么是less? less是什么自然不用多言,乃一个css预编译器,可以扩展css语言,添加功能如如允许变量(variables),混合(mixins),函数(functions) 和许多其他的技 ...

  3. Qt 4.5发布(最大的变动是换用LGPL许可证,移植进了苹果的Cocoa框架。之前的Qt只支持Carbon框架,现在的Qt 4.5两者都支持。单一源代码创建出支持32位或64位字节的Intel或PowerPC Mac二进制文件)

            Nokia的开源Qt开发工具正式发布了4.5版.如前所述,Qt 4.5最大的变动是换用LGPL许可证,目前采用的三个许可证分别为LGPL/GPL和商业许可证.           新版 ...

  4. Validator自动验证与手动验证

    自动: public JResult projectAdd(@Valid Project project, BindingResult result) {Map<String,Object> ...

  5. 《深入实践C++模板编程》之三——模板参数类型详解

    非类型模板参数 和 模板型模板参数 整数以及枚举类型:指向对象或者函数的指针:对对象或函数的引用:指向对象成员的指针.统称为非类型模板参数. 模板型模板参数,是指模板参数还可以是一个模板.   1.整 ...

  6. Visual Studio高分屏下Winform界面变形

    现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者, 分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响 ...

  7. 设计模式及UML图

    UML图 1. 依赖关系

  8. vim之快捷键

    Vim 编辑器是一个基于命令行的工具,是传奇编辑器 vi 的增强版.尽管图形界面的富文本编辑有很多,但是熟悉 Vim 对于每一位 Linux 的使用者都能有所帮助——无论你是经验丰富的系统管理员,还是 ...

  9. 如何从git上批量拉取本地当前分支的所有代码

    1 我本地有一个文件_netrc文件里面存储这git的相关信息,包括用户名和密码 你可以根据自己的git相关信息配置自己的信息 2 我当前的分支是dev,我要拉取当前分支下的所有代码,编写shell脚 ...

  10. TVM使用问题记录

    1.numpy提示repeat错误 错误信息为 One method of fixing this is to repeatedly uninstall numpy until none is fou ...