参考了题解,理解仍然还不够透彻

#include<bits/stdc++.h>
using namespace std;
const int N=550;
const int maxn=1e6+7;
int num[maxn];
int dp[N][N];
int a,b;
int dfs(int len,int pre,bool flag,bool zero)
{if(len==0){return 1;}if(!zero&&!flag&&dp[len][pre]!=-1){return dp[len][pre];}int p,cnt=0,maxx=(flag?num[len]:9);for(int i=0;i<=maxx;i++){if(abs(i-pre)<2){continue;}p=i;if(zero&&i==0){p=-233;}cnt+=dfs(len-1,p,(flag)&&(i==maxx),(p==-233));}if(!flag&&!zero){dp[len][pre]=cnt;} return cnt;
}
int solve(int x)
{int k=0;while(x){num[++k]=x%10;x/=10;}memset(dp,-1,sizeof(dp));return dfs(k,-233,true,true);
}
int main()
{scanf("%d%d",&a,&b);printf("%d",solve(b)-solve(a-1));return 0;
} 

还有一种更易理解的做法

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[15][15],ans;//dp[i][j]表示搜到第i位,前一位是j,的!limit方案totnum;
int a[15],len;
long long L,R;
ll dfs(int pos,int pre,int st,int limit)//pos当前位置,pre前一位数,st判断前面是否全是0,limit最高位限制
{if(pos>len) return 1;//搜完了 if(!limit&&dp[pos][pre]!=-1) return dp[pos][pre];//没有最高位限制,已经搜过了ll ret=0;int res=limit?a[len-pos+1]:9;//当前位最大数字 for(int i=0;i<=res;i++)//从0枚举到最大数字
    {if(abs(i-pre)<2) continue;//不符合题意,继续 if(st&&i==0) ret+=dfs(pos+1,-2,1,limit&&i==res);//如果有前导0,下一位随意 else ret+=dfs(pos+1,i,0,limit&&i==res);//如果没有前导0,继续按部就班地搜
    }if(!limit&&!st) dp[pos][pre]=ret;//没有最高位限制且没有前导0时记录结果 return ret;
}
void part(ll x)
{len=0;while(x) a[++len]=x%10,x/=10;memset(dp,-1,sizeof dp);ans=dfs(1,-2,1,1);
}
int main()
{scanf("%lld%lld",&L,&R);part(L-1);ll minn=ans;part(R);  ll maxx=ans;printf("%lld",maxx-minn);return 0;
}

转载于:https://www.cnblogs.com/LJB666/p/10817108.html

P2657 [SCOI2009]windy数 数位dp入门相关推荐

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

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

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

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

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

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

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

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

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

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

  6. BZOJ1026 [SCOI2009]windy数 数位dp

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

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

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

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

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

  9. P2657 [SCOI2009]windy数

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

最新文章

  1. 新建一个spyder窗口
  2. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布...
  3. 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
  4. Effective MySQL之深入解析复制技术
  5. Android 截屏监听(截图分享功能实现)
  6. 今天将多线程的知识有回顾了下,总结了几点:
  7. 表1 中的值 给表2
  8. Tomcat安装之前为什么要安装JDK
  9. expect远程登录服务器并执行命令
  10. 出现“Failed to update Unity Web Player”解决方法
  11. ImageButton属性
  12. c语言中getnumber函数作用,C语言函数是什么
  13. IntelliJ IDEA 创建普通 JavaSE 项目
  14. BCrypt算法,想想spring security里的BCryptPasswordEncoder
  15. 【一次过】左旋转字符串
  16. [Unity][2D]Sprite精灵多个多边形切割
  17. 2019年的咖啡大战,从杭州开打?
  18. 万科的管理层为何要在质疑中坚定地推迟董事会改选?
  19. t.zijieimg.com/v.douyin.com短网址在线缩短工具
  20. linux修改文件图标,Gnome怎么修改应用图标icon

热门文章

  1. 年终盘点:2021年AI领域值得关注的十件事
  2. 速度比晶体管快1000倍,新型单光子开关登上Nature
  3. 脑智前沿科普|虚拟现实如何欺骗你的大脑
  4. 物理理论发展放缓?这是一种认知误判
  5. 震撼三观:从细胞到宇宙
  6. 李彦宏/王坚/王传福等上榜“中国工程院2019院士增选候选人”引争议,实至名归吗?...
  7. 基本系统部署完成!北斗三号闪耀中国智慧
  8. 我写代码的十八般兵器!
  9. 分享是程序员的必备素质
  10. 10 年 bloger 教你如何优雅玩转博客!