博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数位dp(2)
阅读量:5344 次
发布时间:2019-06-15

本文共 946 字,大约阅读时间需要 3 分钟。

BZOJ 1026 Windy数

  题意:

    给你两个数l,r,求[l,r]中不含前导零且相邻两个数字之差至少为2的正整数个数。

  题解:

    首先很容易想到dfs(x,pre,lim),pre表示的是前一位的数字。但是如果这样就会有一个问题,举个例子,如果r=1000,对于数字15,它本身是符合要求的,但在dp中,它被看作了0015,这样的话前2位的差为0,就被当作不符合要求的数排除掉了。为了解决这个问题,我们在dp是再加入一个状态led,表示比当前位高的几位是不是全都是前导0,而在转移时,如果led为1,就不用排除差小于2的情况了。

    接下来给出代码:

#include
#include
int f[15][10],a[15],cnt;int abs(int x){
return x<0?-x:x;}int dfs(int x,int pre,bool led,bool lim){    if(x==0) return 1;    if(!led&&!lim&&f[x][pre]!=-1) return f[x][pre];    int ans=0,maxl=lim?a[x]:9;    for(int i=0;i<=maxl;++i) if(led||(!led&&abs(i-pre)>=2))        ans+=dfs(x-1,i,led&&!i,lim&&i==maxl);    if(!led&&!lim) f[x][pre]=ans; return ans;}int solve(int x){    for(cnt=0;x;x/=10) a[++cnt]=x%10;    return dfs(cnt,0,1,1);}int main(){    memset(f,-1,sizeof f); int a,b; scanf("%d%d",&a,&b);    printf("%d",solve(b)-solve(a-1)); return 0;}

 

转载于:https://www.cnblogs.com/jxcakak/p/7468038.html

你可能感兴趣的文章
原生JS轮播-各种效果的极简实现
查看>>
软件工程总结作业---提问回顾与个人总结
查看>>
计数器方法使用?
查看>>
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
查看>>
sonar结合jenkins
查看>>
解决VS+QT无法生成moc文件的问题
查看>>
AngularJs练习Demo14自定义服务
查看>>
关于空想X
查看>>
CF1067C Knights 构造
查看>>
[BZOJ2938] 病毒
查看>>
webstorm修改文件,webpack-dev-server不会自动编译刷新
查看>>
Scikit-learn 库的使用
查看>>
CSS: caption-side 属性
查看>>
python 用数组实现队列
查看>>
认证和授权(Authentication和Authorization)
查看>>
Mac上安装Tomcat
查看>>
CSS3中box-sizing的理解
查看>>
传统企业-全渠道营销解决方案-1
查看>>
Lucene全文检索
查看>>
awk工具-解析1
查看>>