bzoj 4521: [Cqoi2016]手机号码
感觉get到了一种数位dp的新姿势,加一位表示当前要填的数有没有限制(感觉以前的写法都太蠢了).
这么写有两个地方要注意:
1.每dp到一位时需要f[i][初始状态]++,相当于这位前都是前导零(这道题我把前两位填了两个10作为初始状态)。
2.因为有了1,所以初始状态后的第一位不能填0,需要特判
f[i][j][k][l][p][q][o]表示填到第几位,上上位和上位分别是什么,4,8是否出现过,三个连续的是否出现过,以及当前位是否有限制。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll pw[100];
ll f[20][11][11][2][2][2][2];
// 位数 上位 这位 4 8 出现0/1 限制0/1
ll solve(ll x)
{
pw[0]=1;
for(int i=1;i<=12;i++)pw[i]=pw[i-1]*10;
int pos;
for(int i=0;i<=12;i++)if(x>=pw[i])pos=i+1;
memset(f,0,sizeof(f));
f[0][10][10][0][0][0][1]=1;
for(int i=1;i<=pos;i++)
{
int ks=x/pw[pos-i]%10;
f[i][10][10][0][0][0][0]=1;
// 刷表
for(int j=0;j<=10;j++)
{
for(int k=0;k<=10;k++)
{
for(int l=0;l<=1;l++)
{
for(int p=0;p<=1;p++)
{
// 这位
for(int q=0;q<=9;q++)
{
if(j==10&&k==10&q==0)continue;
bool b1=0,c1=0,d1=0;
if(j==k&&j==q)b1=1;
if(q==4)c1=1;
if(q==8)d1=1;
f[i][k][q][l|c1][p|d1][1][0]+=f[i-1][j][k][l][p][1][0];
f[i][k][q][l|c1][p|d1][b1][0]+=f[i-1][j][k][l][p][0][0];
}
for(int q=0;q<=ks;q++)
{
if(j==10&&k==10&q==0)continue;
bool b1=0,c1=0,d1=0;
if(j==k&&j==q)b1=1;
if(q==4)c1=1;
if(q==8)d1=1;
if(q!=ks)
{
f[i][k][q][l|c1][p|d1][1][0]+=f[i-1][j][k][l][p][1][1];
f[i][k][q][l|c1][p|d1][b1][0]+=f[i-1][j][k][l][p][0][1];
}
else
{
f[i][k][q][l|c1][p|d1][1][1]+=f[i-1][j][k][l][p][1][1];
f[i][k][q][l|c1][p|d1][b1][1]+=f[i-1][j][k][l][p][0][1];
}
}
}
}
}
}
}
ll ans=0;
for(int i=0;i<=9;i++)for(int j=0;j<=9;j++)for(int k=0;k<=1;k++)for(int l=0;l<=1;l++)for(int s=0;s<=1;s++)
{
if(k&&l)continue;
ans+=f[pos][i][j][k][l][1][s];
}
return ans;
}
ll l,r;
int main()
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}
bzoj 4521: [Cqoi2016]手机号码的更多相关文章
- bzoj 4521 [Cqoi2016]手机号码——数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 dfs真好用~ #include<iostream> #include&l ...
- BZOJ 4521 [CQOI2016]手机号码 - 数位DP
Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...
- bzoj 4521: [Cqoi2016]手机号码【数位dp】
比较基础的数位dp,dfs的时候带上上一位,上上位,是否已经有连续3个相同位,是否有4,是否有8即可 但是要注意两点(在洛谷上一直70) 当l=1e10的时候,直接输出clc(r)即可,因为如果再减去 ...
- 4521: [Cqoi2016]手机号码
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1030 Solved: 609 [Submit][Statu ...
- BZOJ 4521 CQOI 2016 手机号码 数位DP
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 539 Solved: 325[Submit][Status ...
- [BZOJ4521][CQOI2016]手机号码(数位DP)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 875 Solved: 507[Submit][Status ...
- [Bzoj4521][Cqoi2016]手机号码(数位dp)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 870 Solved: 505[Submit][Status ...
- [CQOI2016]手机号码 数位DP
[CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...
- P4124 [CQOI2016]手机号码
P4124 [CQOI2016]手机号码 题解 数位DP DFS 虽然套路,但还是恶心到找不到锅在哪里 注意这个 然后你就发现其实这样就不用记录前导0了 锅在这个鬼地方QAQ 代码 #inclu ...
随机推荐
- GlusterFS分布式存储集群-2. 使用
参考文档: Quick Start Guide:http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Quickstart/ Instal ...
- 无法连接 Plugins Market 失效的日子
一.问题背景 不知道是什么原因,我的 Intellij 连接不上 Plugins Market,这时候我需要使用 @Data 注解来自动生成 Getter.Setter 方法.在添加了相应的依赖之后, ...
- PSP Daily软件beta版本——基于NABCD评论,及改进建议
1.根据(不限于)NABCD评论作品的选题: 此软件的用户人群较为明确,即:用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜在用户还有未来该课堂的学生和需要用PSP方法记录任务完 ...
- CS小分队第二阶段冲刺站立会议(6月1日)
昨日成果:完成了,文件图标的获取,以及代码删除获取文件的图标的功能:实现了从桌面拖动一个应用到窗体进行添加的功能: 遇到问题:获取的文件图标太小了,比较模糊:从外面拖动文件到窗体时,图标一直获取错误, ...
- MYSQL-不能创建表
Can't create table '.\ticket\user_role.frm' (errno: 121) 语法是对的,但显示上面的错误 原因有三种 1.表名重复 2.以该名字命名的表之前创建过 ...
- eg_5
问题描述:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符. 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” ...
- ssh结合使用
springxml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=& ...
- C# 正则提取字符串(提取一个或多个)
实例一:string result = ""; string str = "大家好! <User EntryTime='2010-10-7' Email='zhan ...
- 面试问题总结二(技术能力-PHP)----Ⅳ
57.Linux 的基本命令(重点,现在多数服务器都是Linux 系统) 答:arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmid ...
- [转帖]DAS、SAN、NAS
http://blog.itpub.net/26736162/viewspace-2214368/ DAS(Direct-attached Storage) 直连存储 直连式存储与服务器主机之间的连接 ...