洛谷P4124 手机号码
这题也就是条件限制多了点,也没有别的,套板子就好了
注意这里没有前导零,所以第一位是从1开始填
看注释叭
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int inf=214748364;
const ll mod=1000000007;
inline ll read()
{
char ch=getchar();
ll x=0;bool f=0;
while(ch<'0'||ch>'9')
{
if(ch=='-')f=1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f?-x:x;
}
ll l,r;
ll g[20][10][2][2][2][20],li[20];
int t;
void make(ll k)
{
t=0;
memset(g,-1,sizeof(g));
while(k)
{
li[++t]=k%10;
k/=10;
}
}
ll dfs(int now,int lst,bool g8,bool g4,bool lim,bool maxc,int nc)
/*
当前填到了第几位
上一位填的啥
有没有8
有没有4
是否顶上界
有没有至少连续3个相同的数
上一位和它前面的位形成了几个连续的相同的数(nowcnt)
*/
{
if(!now) return maxc;
if(!lim&&g[now][lst][g8][g4][maxc][nc]!=-1) return g[now][lst][g8][g4][maxc][nc];
int up=lim?li[now]:9;
ll rtn=0;
for(int i=(now==t);i<=up;i++)
{
int mma=nc;
if(g8&&i==4)continue;//有8没4
if(g4&&i==8)continue;//有4没8
if(i==lst)
{
mma++;
if(nc==0)mma++;//因为一旦出现这一位与上一位相同,且上一位和上上位不相同,则产生连续两位相同的数
}
else mma=0;//如果与上一位不同,则说明连续的位断开,要传下去的nc变为0
rtn+=dfs(now-1,i,g8||(i==8),g4||(i==4),lim&&(i==up),(mma>=3)||maxc,mma);
}
if(!lim) g[now][lst][g8][g4][maxc][nc]=rtn;
return rtn;
}
int main()
{
ll ans=0;
l=read();
r=read();
make(r);
ans=dfs(t,0,0,0,1,0,0);
if(l>10000000000)//因为当l==1e10时,l-1=1e10-1,也就是说只有10位,然而dfs里面没有判位数,所以要对l=1e10进行特判(懒得在dfs里面加特判了ρωρ)
{
make(l-1);
ans-=dfs(t,0,0,0,1,0,0);
}
printf("%lld",ans);
}
洛谷P4124 手机号码的更多相关文章
- 洛谷 P4124 (数位 DP)
### 洛谷 P4124 题目链接 ### 题目大意: 给你一段区间,让你求满足下列两个条件时的数的个数. 1.至少有 3 个相邻相同数字 (即 111 .1111 .222 等) 2.不能同时出现 ...
- 【洛谷P4124】[CQOI2016]手机号码
手机号码 数位DP模板题 记忆化搜索: #include<iostream> #include<cstring> #include<cstdio> using na ...
- [洛谷P4124][CQOI2016]手机号码
题目大意:给你两个$l,r$,求出$[l,r]$中符合要求的数,要求为至少有$3$个相邻的相同数字,且不可以同时出现$8$和$4$ 题解:数位$DP$ 卡点:无 C++ Code: #include ...
- 洛谷 P4124 [CQOI2016]手机号码
题意简述 求l~r之间不含前导零,至少有三个相邻的相同数字,不同时含有4和8的11位正整数的个数 题解思路 数位DP,注意在l,r位数不够时补至11位 代码 #include <cstdio&g ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
随机推荐
- 洛谷 P2347 砝码称重 & [NOIP1996提高组](dp,枚举)
传送门 解题思路 一看数据范围<1000就坚定了我暴力的决心(不愧是1996年代的题还是t4QAQ) 所以很显然,暴力之中有一点dp的思想,就是把它们像多重背包一样拆分,拆成a1+a2+a3+a ...
- HNUSTOJ-1051 最长的波动序列
1051: 最长的波动序列 时间限制: 1 Sec 内存限制: 128 MB提交: 47 解决: 13[提交][状态][讨论版] 题目描述 有一个长度为N的整数序列,序列里面的数是两两不同的,现在 ...
- mongoose 数据库操作2
mongoose的内置的主要功能解说 除了定义文档结构和你要存储的数据类型外.模式(Schema)还用于下面定义: · Validators (异步和同步) · Defa ...
- C#.NET、Power BI、数据挖掘
阅读目录 1.采集目目标特点与分析 2.方案第一版-Low到爆,别笑话 3.碰壁后的第二版方案 4.最终方案第三版 5.总结 说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C# ...
- 50. Pow(x, n) (JAVA)
Implement pow(x, n), which calculates x raised to the power n(xn). Example 1: Input: 2.00000, 10 Out ...
- numpy中的range()
1.arange返回一个array对象,arange(5)=([0,1,2,3,4]) 2.如果是两个参数,第一个参数是起点,第二个参数是终点 3.如果是三个参数,那么第三个参数就是步长
- diff 比较两个文件的不同
1.命令功能 diff 逐行比较文件内容,并输出文件差异. 2.语法格式 diff option file1 file2 diff 选项 文件1 文件2 参数说明 参数 参数说明 ...
- 写了一个简单可用的IOC
根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录 只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免 ...
- MySQL--缓存的使用注意
几个参数 query_cache_type:为ON时开启,为OFF关闭,为DEMAND时则只有查询语句中有sql cache时才使用缓存 query_cache_size: 缓存的内存空间 query ...
- man lspci
lspci(8) Linux PCI Utilities lspci(8) NAME lspci - 列出 ...
