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. fio安装使用

    # wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz # tar xvf fio-2.2.5.tar.gz# cd fio-2.2.5# ./con ...

  2. C# 操作地址 从内存中读取写入数据(初级)

    本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光 ...

  3. windows服务总结

    一.创建windows服务项目创建完成后结构,如: 其中,Program.cs代码: using System; using System.Collections.Generic; using Sys ...

  4. VLC播放各种源

    RTSP    rtsp://admin:Shws1610@192.168.1.33:554/channel/01 UDP 播放推导本机上的udp流 : udp://@:1234 播放其他机器上的ud ...

  5. count(*),count(1),count(字段)

    如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null. 如:    ID     DD     1      e     2    null    select  count( ...

  6. 十一,k8s集群访问控制之ServicAccount

    目录 认证安全 连接Api-Server的两类账号 ServiceAccount 创建 使用admin 的SA 测试 URL访问kubernetes资源 APIserver客户端定义的配置文件 kub ...

  7. laravel的下载与安装

    下载代码 https://github.com/laravel/laravel 在开发环境中配置好之后将根目录的 .env.example 文件改成 .env ,此文件是laravel的配置文件,将 ...

  8. linux常用查看命令

    一般查看 cat -n 文件名 n 代表显示行号 分页查看 more 文件名 more -50 文件名 -50 代表一页显示50行 向下翻页  空格 向上翻页 b more +/搜索值 文件名 查找文 ...

  9. python读取txt文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x8e in position 8: illegal multibyte sequence

    python读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x8e in position 8: illegal multibyte ...

  10. Selenium(4)

    练习1:使用selenium+firefox测试ecshop登录过程 一.WebDriver 1.启动浏览器 (1)启动Firefox浏览器 a.启动默认路径下的浏览器 WebDriver drive ...