数位dp

来源:互联网 发布:卡证制作软件 编辑:程序博客网 时间:2024/06/05 09:31

【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


原创粉丝点击