P3413 萌数

先打出暴搜代码,参数有\(pos,limit,hui\),其中bool类型的\(hui\)表示到当前是否有回文。

暴搜代码中加入了一个剪枝:if(!limit&&hui) return pow10[pos];,这个!limit很重要,我就是因为这个没加,暴搜代码都调了半天。然后就是if(pos==0) return hui;

我们还需要记录下填过的位是不是前导\(0\),所以用-1表示前导\(0\)。

接下来考虑怎么记忆化,我们发现,当前的答案只和\(pos\)、\(sta[pos+1]\)和\(sta[pos+2]\)有关。我们在\(pos\)相同的情况下分类讨论:

  • 后\(2\)位都不是前导\(0\),而且都不一样。
  • 后\(2\)位都不是前导\(0\),而且都一样。
  • 后\(2\)位中最高位是前导\(0\)。
  • 后\(2\)位中都是前导\(0\)。

我们又可以发现,第\(2\)种情况和第\(3\)中情况本质上是一样的。所以\(pos\)相同的时候,一共只有\(3\)种情况,我们根据情况计算出状态码,然后用\(f[pos][stanum]\)来记忆化。空间和时间都很优,\(1010*3\)。

注意

  • \(L,R\)足足有\(1000\)位,所以得用string存。而字符串减\(1\)操作不好弄,所以答案用\(solve(r)-solve(l)\),然后特判\(l\)是否符合条件,符合条件再额外加\(1\)。
  • 虽然不需要开long long,但是打表计算\(pow10\)的时候需要类型转换一下再取模,否则\(*10\)会溢出。

Code

点击查看代码
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
string l,r;
int a[1010],sta[1010],len;
int f[1010][3],pow10[1010];
int dfs(int pos,bool limit,bool hui){
if(!limit&&hui) return pow10[pos];
if(pos==0) return hui;
int stanum;
if(sta[pos+1]==-1&&sta[pos+2]==-1) stanum=2;
else if(sta[pos+2]==-1||sta[pos+1]==sta[pos+2]) stanum=1;
else stanum=0;
if(!limit&&f[pos][stanum]!=-1) return f[pos][stanum];
int rig=limit?a[pos]:9,ans=0;
for(int i=0;i<=rig;i++){
bool is=(sta[pos+1]==-1&&i==0);
sta[pos]=is?-1:i;
bool thui=hui||(sta[pos]==sta[pos+1]&&sta[pos+1]!=-1)||(sta[pos]==sta[pos+2]&&sta[pos+2]!=-1);
ans=(ans+dfs(pos-1,limit&&i==rig,thui))%mod;
}
if(!limit) f[pos][stanum]=ans;
return ans;
}
int solve(string s){
len=s.size();
for(int i=0;i<len;i++){
a[len-i]=s[i]-'0';
}
sta[len+1]=sta[len+2]=-1;
return dfs(len,1,0);
}
int main(){
pow10[0]=1;
for(int i=1;i<=1005;i++) pow10[i]=(10ll*pow10[i-1])%mod;
memset(f,-1,sizeof f);
cin>>l>>r;
bool is=0;
int len=l.size();
for(int i=0;i<len-2;i++){
if(l[i]==l[i+1]||l[i]==l[i+2]){
is=1;
break;
}
}
if(l[len-2]==l[len-1]) is=1;
cout<<(solve(r)-solve(l)+is+mod)%mod;
return 0;
}

[题解]P3413 萌数的更多相关文章

  1. [Luogu] P3413 萌数

    题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:已和谐 . 题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只 ...

  2. 洛谷$P3413$ 萌数 $SAC\#1$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门! 非常套路的数位$dp$,,,?打起来就很爽昂,,,不要脑子,我就很爱嘻嘻嘻 然后$[l,r]$这种问题不显然考虑套路地搞成$[1,l-1]$和$[1,r]$嘛 ...

  3. 题解 P3413 【SAC#1 - 萌数】

    这道题刚开始正向思维,然后处理重复的时候咕咕了. 参考了@巨型方块 大佬的题解后AC了,在这里就说几个我觉得比较重要或是容易被忽略的点,然后补充一些跳过的证明. 这道题的状态可以设为$dp[i][j] ...

  4. 洛谷P3413 SAC#1 - 萌数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P3413 题目大意: 定义萌数指:满足"存在长度至少为2的回文子串"的数. 求区间 \([L,R]\) ...

  5. 洛谷P3413 SAC#1 - 萌数(数位dp)

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  6. 【洛谷P3413】萌数

    题目大意:求区间 [l,r] 内萌数的个数,其中萌数定义为数位中存在长度至少为 2 的回文子串的数字. 题解:l, r 都是 1000 位级别的数字,显然是一道数位 dp 的题目,暴力直接去世. 发现 ...

  7. 洛谷 P3413 【萌数】

    敲完这篇题解,我就,我就,我就,嗯,好,就这样吧... 思路分析: 首先我们要知道一个回文串的性质--假如说一个[l-1,r+1]的串是回文的,那么[l,r]一定也是回文的. 所以我们只要记录前一个数 ...

  8. luogu 3413 SAC#1 - 萌数

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  9. [luogu3413]萌数

    [luogu3413]萌数 luogu 考虑数位dp 怎么判断一个数是不是萌数? 只要知道其中某一位和它的前一位相等或者和前一位的前一位相等,那么它就是一个萌数 什么样的数不是萌数? 对于它的每一位都 ...

  10. 【题解】P3939数颜色

    [题解]P3939 数颜色 不要数据结构和模板学傻了... 考虑到兔子们交换都是相邻的,说明任何一次交换只会引起\(O(1)\)的变化. 我们开很多\(vector\)存没种兔子的下标就好了.到时候二 ...

随机推荐

  1. 微信小程序中supabase在线数据库使用指南

    在微信小程序中使用supabase在线数据库可以无需后端和服务器完成个人小项目的开发.本文记录我的使用过程,在阅读本文前,建议您先满足以下条件: 持有可用于开发的微信小程序 了解kexue上网 第一步 ...

  2. Golang指针解析

    一.简单说明 golang指针可以这样理解:本身为一个整型常量,但由于其声明时为指针,因此拥有了特殊的能力,即在其前增加 * ,即可直接访问内存编号为该整型常量的数据.而对于某个定义的常量,在前面加 ...

  3. 主流负载均衡器LVS、Nginx、HAProxy介绍

    一.简单介绍 1.1 LVS LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器,LVS由用户空间的ipvsadm和内核空间的ipvs组成,ipvsadm用来定义规则, ...

  4. CJ20N 增强客户字段 引用别人公众号文章

    引用:PS CJ20N 项目定义属性字段增强 (qq.com) 达成效果: 一.CJ20N添加字段 二.用户出口CNEX0006 CMOD分配CNEX0006 出口EXIT_SAPLCJWB_002 ...

  5. 浅谈数据开发神器——数栈离线开发平台(BatchWorks)

    数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...

  6. vue导出Excel表格各种样式

    https://www.cnblogs.com/Awchao/p/14143385.html

  7. 保姆级教程!HyperMesh施加正弦荷载

    HyperMesh怎么施加正弦荷载? 在HyperMesh中施加正弦荷载,可以通过定义载荷方程(equation)来实现.正弦荷载通常用于模拟周期性变化的力或压力,比如振动或波动载荷.以下是一般的步骤 ...

  8. UFT 连接数据库 & 执行sql 语句

    1. connection sql server 2. 执行sql 语句 3. get db value 4. return DB data row when we have sql command

  9. 100条常用SQL语句

    一.基本查询语句 查询所有数据: SELECT * FROM 表名; 查询特定列: SELECT 列名1, 列名2 FROM 表名; 条件查询: SELECT * FROM 表名 WHERE 条件; ...

  10. 10-2 MySQL 索引优化与查询优化

    10-2 MySQL 索引优化与查询优化 @[toc] 这篇文章是我蹲在<尚硅谷>-康师傅博主家的 WiFi 上(不是),连夜 Ctrl+C / V 俩的镇站神文. 这篇转载只是为了,跟大 ...