D - windy数 (数位DP)

D - windy数

 windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?

题解:用dp[i][j]表示对前i位,在第i+1位为j时的windy数

代码解释:

/***********************************************/
int a[20];
ll dp[20][11];//记录前i位中windy数个数 
//因为前一位j为多少对后面的枚举是有影响的 

ll dfs(int cur,int pre,bool limit,bool lead) 
{	//lead用于判断从高位到低位枚举时有没有前导0,
	//如对1232
	//当前面几位枚举的都是0时,后面一位的枚举是不受前面一位限制的,
	//因为如果前面几位都是0,就相当于前几位是不存在的,
	//所以才有: if( abs(i-pre) >=2 || lead) 
	//这就是枚举条件 
	if(cur==0) return 1;
	if(!limit && dp[cur][pre]!=-1 && pre>0) return dp[cur][pre];
	// pre>0 ,如果pre==0,涉及到位数,需要再次循环 
	ll ans=0;
	int cu=limit?a[cur]:9;
	
	for(int i=0;i<=cu;i++)
	{
		if( abs(i-pre) >=2 || lead){
			//cout<<cur<<" "<<i<<"  "<<endl;;
			ans+=(dfs(cur-1,i,limit & (i==a[cur]) , lead&(i==0) ));
		}
	}
	if(!limit) dp[cur][pre]=ans;//还是那个记忆化 
	return ans;
}

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

int main()
{
	ll a,b;
	while(cin>>a>>b)
	{
		mem1(dp);
		
		cout<<solve(b)-solve(a-1)<<endl;
		//cout<<solve(10);
	}

	return 0;
}

  

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值