HDU 2089 - 不要62(数位DP入门)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089
【题意】
给定一个区间 [L,R],让你找出区间中所有满足没有连续的数字62出现同时也没有数字4出现的数字的个数(0 < L,R < 1000000)
【思路】
数位DP入门题,设 表示从高位到低位枚举到第pos位且前一位不是6时的答案, 表示从高位到低位枚举到第pos位且前一位是6时的答案,然后记忆化搜索
#include<bits/stdc++.h>
using namespace std;
int a[20];
int dp[20][2];
int dfs(int pos,int pre,int six,bool limit){
if(-1==pos) return 1;
if(!limit && dp[pos][six]!=-1) return dp[pos][six];
int up=limit?a[pos]:9;
int ans=0;
for(int i=0;i<=up;++i){
if(i==4) continue;
if(pre==6 && i==2) continue;
if(i==6) ans+=dfs(pos-1,i,1,limit && i==up);
else ans+=dfs(pos-1,i,0,limit && i==up);
}
if(!limit) dp[pos][six]=ans;
return ans;
}
int solve(int x){
int pos=0;
while(x){
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1,-1,0,true);
}
int main(){
int le,ri;
memset(dp,-1,sizeof(dp));
while(scanf("%d%d",&le,&ri)==2){
if(0==le && 0==ri) break;
int ans=solve(ri)-solve(le-1);
printf("%d\n",ans);
}
return 0;
}