数位dp

【what is 数位dp?

说白了,就是为了解决一类与数位有关的区间统计问题,无法暴力求解,只能在数位上进行操作。而这样往往需要做一些预处理,于是就用到了这东西。

【how to?

从高到低枚举第一次<n对应位,之后的位就可以从0...0~9...9了,预处理后就可以直接统计了。

看起来很简单可是蒟蒻如我只AC了3道..........

以hdu2089为例【我知道代码很丑你们将就着看吧】。

预处理如下。

 

f[0][0]=1;
	for(i=1;i<=6;i++)
		for(j=0;j<=9;j++)
			if(j!=4)
				for(k=0;k<=9;k++)
					if(j!=6||k!=2) f[i][j]+=f[i-1][k];


然后这是统计。

 

 

for(i=dgs;i>0;i--)
		{
			for(j=0;j<(m/d[i])%10||(i==1&&j==m%10);j++)
				if(j!=4&&(j!=2||(m/d[i+1])%10!=6)) ans1+=f[i][j];
			if(((m/d[i])%10==4)||((m/d[i])%10==2&&(m/d[i+1])%10==6)) break;
		}


(其实我觉得把原数单独挑出来判断是不是会更好..........................................

 

 

【一些题目(不定期更新)

hdu 2089

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值