hdu——2089(数位dp,一类题)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2089

解析:这是一类题,注意总结。

源代码:

#include <iostream>
using namespace std;
int  dp[10][3];
void init()
{
	
	//dp[i][0]表示没有不吉利数字的,dp[i][1]表没有不吉利数字的,但开头数字为2,
	//dp[i][2]表示有不吉利数字的 
        dp[0][1]=0;
        dp[0][2]=0;
	dp[0][0]=1;
	for(int i=1;i<9;i++)
      {
	  dp[i][0]=dp[i-1][0]*9-dp[i-1][1];   //位数为i的时候 
	  dp[i][1]=dp[i-1][0];
	  dp[i][2]=10*dp[i-1][2]+dp[i-1][1]+dp[i-1][0];
      }
}
int fun(int k)
{
	    int digit[15];
	    int q=0;
		while(k)
		{
			digit[q++]=k%10;
			k/=10;
		}
		digit[q+1]=0;
		int ans=0;
		int flag=0;
		for(int i=q-1;i>=0;i--)
		{
			ans+=(dp[i][2]*digit[i]);//包含不吉利数字的,则直接加上就可以,不用判断。
			if(flag)
			{
				ans+=(digit[i]*dp[i][0]);
			}
			else  
			{ 
			        if(digit[i]>4) ans+=dp[i][0];
				if(digit[i]>6) ans+=dp[i][1];
				if(digit[i+1]==6&&digit[i]>2) ans+=dp[i+1][1];
			}
			if(digit[i]==4||(digit[i+1]==6&&digit[i]==2)) flag=1;
		}
        return ans;//返回的是不吉利数字的个数。
}
int main()
{	
	init();
    int n,m;
	while(cin>>m>>n)
	{		
	    if(m==0&&n==0) break;
        int re=n-m+1-(fun(n+1)-fun(m));//巧妙的利用(n+1)便可以不用测当前是否为不吉利数字了。
		cout<<re<<endl;
	} 
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值