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

思路

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

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

那我们可以用记忆化搜索的方式就行计算。记忆化搜索只需要三个参数。当前构造到的位置 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 即可。

不要忘记取模。

代码

cpp#include<bits/stdc++.h> 复制代码
>#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;//减法取模要+MOD
	return 0;
}
相关推荐
吞下星星的少年·-·2 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang20242 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码3 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-3 小时前
两数之和-C++实现
c++·算法
j7~3 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号3 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..4 小时前
【C++】类和对象
c++·算法
D e re k ZH4 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
释厄6235 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节