博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CQOI2016]手机号码 数位DP
阅读量:5277 次
发布时间:2019-06-14

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

[CQOI2016]手机号码

用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好了,答案为\(work(R)-work(L-1)\)

#include 
#include
#define DP dp[p][a][b][hav_same][hav8][hav4][limited]#define ll long longusing namespace std;ll dp[14][11][11][2][2][2][2];int num[14];ll solve(int p, int a, int b, bool hav_same, bool hav8, bool hav4, bool limited){ //当前第p位,前2位为a,前1位为b,hav_same:是否有三个连续相等的,hav_8,hav_4:是否存在数字8\4,是否限制取数范围 if(hav4&&hav8) return 0; if(p<=0) return hav_same; if(DP!=-1) return DP; ll ans=0; int maxnum=(limited?num[p]:9); for(int i=0;i<=maxnum;++i) ans+=solve(p-1, b, i, hav_same||(i==a&&i==b), hav8||(i==8), hav4||(i==4), limited&&(i==maxnum)); return DP=ans;}ll work(ll x){ if(x<1e10) return 0; memset(dp, -1, sizeof(dp)); int len; for(len=0;x;x/=10) num[++len]=x%10; ll ans=0; for(int i=num[len];i>=1;--i) ans+=solve(11-1, -1, i, 0, i==8, i==4, i==num[len]); return ans;}int main(){ ll l,r; scanf("%lld %lld", &l, &r); printf("%lld\n", work(r)-work(l-1)); return 0;}

转载于:https://www.cnblogs.com/santiego/p/11185422.html

你可能感兴趣的文章
axure学习点
查看>>
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
0925 韩顺平java视频
查看>>
iOS-程序启动原理和UIApplication
查看>>
mysql 8.0 zip包安装
查看>>
awk 统计
查看>>
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>