首页 > 其他 > 详细

数位DP

时间:2021-07-20 09:22:35      阅读:24      评论:0      收藏:0      [点我收藏+]
#include<bits/stdc++.h>
#define N 22
#define M 11
#define db double
#define ll long long
#define ldb long double
#define ull unsigned long long
using namespace std;
const int h=3,ki=149,mo=998244353;
int mod(int x){return (x%mo+mo)%mo;}
int inc(int x,int k){x+=k;return x<mo?x:x-mo;}
int dec(int x,int k){x-=k;return x>=0?x:x+mo;}
int ksm(int x,int k)
{
	int ans=1;
	while(k){if(k&1)ans=1ll*ans*x%mo;k>>=1;x=1ll*x*x%mo;}
	return mod(ans);
}
int inv(int x){return ksm(x,mo-2);}
int read()
{
	char ch=0;int x=0,flag=1;
	while(!isdigit(ch)){ch=getchar();if(ch==‘-‘)flag=-1;}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();}
	return x*flag;
}
void write(int x)
{
	if(!x)return (void)putchar(48);
	if(x<0)putchar(45),x=-x;
	int len=0,p[20];
	while(x)p[++len]=x%10,x/=10;
	for(int i=len;i>=1;i--)putchar(p[i]+48);
}
int a[N],dp[N][M][2];
int solve(int s)
{
	if(s==0)return 0;
	int n=0;while(s)a[++n]=s%10,s/=10;reverse(a+1,a+n+1);
	
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=a[1];i++)dp[1][i][i==a[1]]=1;
	for(int x=2;x<=n;x++)for(int i=1;i<=9;i++)dp[x][i][0]=1;
	
	for(int x=1;x<n;x++)
	for(int lst=0;lst<=9;lst++)
	if(dp[x][lst][0]||dp[x][lst][1])
	for(int i=0;i<=9;i++)if(abs(i-lst)>=2)
	{
		int f0=dp[x][lst][0];
		int f1=dp[x][lst][1];
		int &g0=dp[x+1][i][0];
		int &g1=dp[x+1][i][1];
		
		if(i<a[x+1])g0+=f0+f1;
		if(i>=a[x+1])g0+=f0;
		if(i==a[x+1])g1+=f1;
	}
	
	int ans=0;
	for(int lst=0;lst<=9;lst++)ans+=dp[n][lst][0]+dp[n][lst][1];
	return ans;
}
int main()
{
	int l=read(),r=read();
	write(solve(r)-solve(l-1));
	return 0;
}

数位DP

原文:https://www.cnblogs.com/Creed-qwq/p/15033049.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!