hdu2089 不要62 数位DP

来源:互联网 发布:淘宝李宁乒乓球运动服 编辑:程序博客网 时间:2024/04/30 10:42

入门题,看到YMW开始撸数位DP时我也来凑个热闹= =

然而不管什么数据都差了1= =然后看到了教程中这么清爽的代码= =

我决定来规范一下数位DP的代码风格

一般来说数位DP怎么写都不容易T

但是有时候出题人用心良苦出到10的100w次方的时候【比如GDKOI,感觉还是很虚的

突然想起来决定来吐槽一下HDU,居然有人把BPM136这个账号注册了= =,好吧只好改成BPMThor

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;inline LL read(){LL d=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}return d*f;}#define N 1000000int f[10][3]={0};int n,m;int A[10],len;int dfs(int k,bool six,bool sy){if(k==0)return 1;if(!sy&&f[k][six]!=-1)return f[k][six];int ret=0,tt=sy?A[k]:9;fo(i,0,tt){if(i==4||six&&i==2)continue;ret+=dfs(k-1,i==6,sy&&i==tt);}if(!sy)f[k][six]=ret;return ret;}int find(int a){memset(A,0,sizeof(A));len=0;while(a){A[++len]=a%10;a/=10;}int ans=dfs(len,0,1);return ans;}int main(){memset(f,-1,sizeof(f));int l,r;while(scanf("%d%d",&l,&r)!=EOF&&(l+r)){int ans=find(r)-find(l-1);printf("%d\n",ans);}return 0;}


0 0