记忆化搜索数位dp 过不了样例求助
查看原帖
记忆化搜索数位dp 过不了样例求助
715233
Dino_chx楼主2023/3/22 20:32

调了好久都没看出来什么错误,请帮我看看吧!

#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll dp[20][20][2][2];
int num[20],target;
ll dfs(int step,int now,bool zero,bool limit)
{
	ll ret=0;
	if(!step)
	return now;
	if(dp[step][now][zero][limit]!=-1)
	return dp[step][now][zero][limit];
	int up=(limit?num[step]:9);
	for(int i=0;i<=up;i++)
	{
		if(!i&&zero)
		ret+=dfs(step-1,now,1,limit&&(i==up));
		else if(i==target)
		ret+=dfs(step-1,now+1,0,limit&&(i==up));
		else if(i!=now)
		ret+=dfs(step-1,now,0,limit&&(i==up));
	}
	dp[step][now][zero][limit]=ret;
	return ret;
} 
ll solve(ll x)
{
	int length=0;
	while(x)
	{
		num[++length]=x%10;
		x/=10;
	}	
	memset(dp,-1,sizeof dp);
	return dfs(length,0,1,1);
}
int main()
{
	ll l,r;
	scanf("%lld%lld",&l,&r);
	for(int i=0;i<=9;i++)
	{
		target=i;
		printf("%lld ",solve(r)-solve(l-1));
	}
    return 0;
}
2023/3/22 20:32
加载中...