编辑文章 - 题解:P11557 [ROIR 2016] 有趣数字 (Day 2)

devtools/2025/2/22 7:07:18/

思路

记忆化搜索。很明显这题的输入一定是字符串。那么我们还需要写一个字符串减法,来计算左端点减一的值。

题目要求计算区间 l ∼ r l \sim r lr 内有趣的数字的数量。那么 1 ∼ r 1 \sim r 1r 的有趣数字的数量减去 1 ∼ l − 1 1 \sim l-1 1l1 的数量就是区间内有趣数字的数量。

那我们可以用记忆化搜索的方式就行计算。记忆化搜索只需要三个参数。当前构造到的位置 n o w now now,上一个数字 l a s t last last,以及当前构造的数字是否顶格 l l l

使用 l a s t last last 参数来判断当前数字是否按非递减顺序排列。使用 l l l 参数来判断当前数位上所能取最大值。

因为记忆化搜索是在每一位上构造符合要求的数字,所以当数字构造完毕后一定也符合题目要求,直接返回 1 1 1 即可。

不要忘记取模。

代码

#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
#define lhs printf("\n");
using namespace std;
const int N=3e5+10;
const int M=1e9+7;
const int inf=0x3f3f3f3f;
string l,r,a;
int a1[N],a2[N],ans[N];
ll dp[114][20][5];
string jian(string s1,string s2)
{string h;for(int i=0;i<s1.size();i++){a1[s1.size()-1-i]=s1[i]-'0';}for(int i=0;i<s2.size();i++){a2[s2.size()-1-i]=s2[i]-'0';}for(int i=0;i<max(s1.size(),s2.size());i++){ans[i]=a1[i]-a2[i];}for(int i=0;i<max(s1.size(),s1.size());i++){if (ans[i]<0){ans[i]+=10;ans[i+1]--;}}int k=N-1;while((!ans[k]) and  k>0){k--;	}for(int i=k;i>=0;i--){char x=char(ans[i]+48);h+=x;}return h;
}
ll dfs(int now,int last,int l)
{if(now==a.size()){return 1;}if(dp[now][last][l]!=-1){return dp[now][last][l];}int k=int(a[now])-48;int b=l ? k : 9;ll ans=0;for(int i=0;i<=b;i++){if(i>=last){ans+=dfs(now+1,i,l and i==b);ans%=M;}} return dp[now][last][l]=ans;
}
ll solve(string x)
{memset(dp,-1,sizeof dp);a.clear();a+=x;return dfs(0,0,1);
} 
int main()
{cin>>l>>r;cout<<(solve(r)-solve(jian(l,"1"))+M)%M;//减法取模要+MODreturn 0;
}

http://www.ppmy.cn/devtools/159000.html

相关文章

【Prometheus】prometheus黑盒监控balckbox全面解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

【模板】并查集

int fa[MAXN], rank[MAXN]; inline void init(int n) {for (int i 1; i < n; i){fa[i] i;rank[i] 1;} }int find(int x) {return x fa[x] ? x : (fa[x] find(fa[x])); // 路径压缩 }inline void merge(int i, int j) {int x find(i), y find(j);if (rank[x] < ra…

网络安全知识:网络安全网格架构

在数字化转型的主导下&#xff0c;大多数组织利用多云或混合环境&#xff0c;包括本地基础设施、云服务和应用程序以及第三方实体&#xff0c;以及在网络中运行的用户和设备身份。在这种情况下&#xff0c;保护组织资产免受威胁涉及实现一个统一的框架&#xff0c;该框架根据组…

Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章&#xff1a;PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中&#xff0c;传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR&#xff08;被动红外&#xff09;传感器。PIR 传感器能够检测人体发出的红外线&#xff0c;常用于安防系统、自动…

Node.js调用DeepSeek Api 实现本地智能聊天的简单应用

在人工智能快速发展的今天&#xff0c;如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用&#xff0c;它通过调用硅基流动&#xff08;SiliconFlow&#xff09;的API接口&#xff0c;实现了与DeepSeek模型的智能对话…

数据集笔记:SINPA 新加坡停车场数量数据集

GitHub - yoshall/SINPA 从Data.gov.sg抓取了来自新加坡1,921个停车场的三年实时PA数据&#xff0c;每5分钟一次 为了减轻缺失值的影响&#xff0c;我们将原始数据集重新采样为15分钟间隔&#xff0c;并选择PA缺失率低于30%的停车场此外&#xff0c;由于时间分布的变化&#xf…

机器视觉中的3d和2d的区别

在机器视觉中&#xff0c;3D和2D的主要区别体现在数据的维度、处理方式及应用场景上。以下是具体对比&#xff1a; 数据维度 2D视觉 &#xff1a;处理二维图像&#xff0c;仅包含宽度和高度信息&#xff0c;通常以像素矩阵表示。 3D视觉 &#xff1a;处理三维数据&#xff0c;…

股票自动化交易

股票自动化交易是指通过编写程序自动执行股票买卖操作&#xff0c;以减少人为干预&#xff0c;提高交易效率和准确性。Python作为一种功能强大且易于上手的编程语言&#xff0c;广泛应用于金融领域&#xff0c;尤其是在量化交易和自动化交易中。本文将介绍如何使用Python实现一…