HDU-2089-数位dp

来源:互联网 发布:联合国数据库怎么使用 编辑:程序博客网 时间:2024/04/26 05:52

题目大意:不要62和4的数字在区间(n,m)有几个;

题目解析:数位dp模板题,dfs的时候判断前一位是否为6;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;int dp[12][2],n,m,num[12];int dfs(int pos,int sta,bool limit){if(pos==-1)return 1;if(!limit&&dp[pos][sta]!=-1)return dp[pos][sta];int u=limit?num[pos]:9;int ans=0;for(int i=0;i<=u;i++){if(i==4)continue;if(sta==1&&i==2)continue;ans+=dfs(pos-1,i==6,limit&&i==num[pos]);} if(!limit)return dp[pos][sta]=ans;return ans;} int cal(int x){int pos=0;while(x){num[pos++]=x%10;x/=10;}return dfs(pos-1,0,true);}int main(){memset(dp,-1,sizeof(dp));while(scanf("%d%d",&n,&m)!=EOF&&(n!=0&&m!=0)){printf("%d\n",cal(m)-cal(n-1));}}

0 0