牛客:处女座和小姐姐(三)(数位dp)

本文介绍了一种使用数位动态规划(数位DP)解决的问题:求解给定区间内包含数字'6'的数的个数。通过记忆化搜索避免重复计算,确保了算法效率。代码实现采用C++,详细展示了如何计算0到n之间不包含特定数字的数的个数,进而得到最终答案。

传送门:处女座和小姐姐(三)

题意:给个区间,求区间中包含六的数的个数(long long 型)

思路:数位DP,还是dalao的模板好,先求出0~n中不包含六的数,再减一下。

WA:记忆化搜索(dfs),否则TLE...

/***********************************************/
int a[20];
ll dp[20];//记录前i位中没有6的个数 

ll dfs(int cur,bool limit) 
{						
	if(cur==0) return 1;
	if(!limit && dp[cur]!=-1) return dp[cur];
	ll ans=0;
	int cu=limit?a[cur]:9;
	
	for(int i=0;i<=cu;i++)
	{
		if(i!=6 ) 	//显然如果前面几位的情况中有出现6,那么就不会继续下去 
			ans+=(dfs(cur-1,limit & (i==a[cur]) ));
	}
	if(!limit) dp[cur]=ans;//还是那个记忆化 
	return ans;
}

ll solve(ll x)
{
	int cut=0;
	while(x){
		a[++cut]=(x%10);
		x/=10;
	}
	return dfs(cut,1);
}

int main()
{
	ll a,b;
	mem1(dp);
	cin>>a>>b;
	cout<<b-a+1-solve(b)+solve(a-1)<<endl;
	return 0;
}

  

  

转载于:https://www.cnblogs.com/liuyongliu/p/10340092.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值