数位dp 不要62

#include<iostream>
#include<string.h>
using namespace std;
int a[20];
int dp[20][2];
int dfs(int pos,bool pre,bool limit)//pos表示当前的数位,pre表示前一位是否为6,limit用来判断是否有上限,即能否去取到9
{
if(pos==0) return 1;
if(!limit&&dp[pos][pre]!=-1) return dp[pos][pre];//这里是避免重复计算,都是没限制且没计算过的就返回值
int ans=0;
int up;
up=limit?a[pos]:9;//
for(int i=0;i<=up;i++)
{
if(i==4||(pre&&i==2))//当前位为4或者当前位为2且前一位为6,跳过。
continue;
else
ans+=dfs(pos-1,i==6,i==up&&limit);
}
if(!limit) dp[pos][pre]==ans;
return ans;
}
int solve(int x)//将给出的数的各个位拆分到一个数组中
{
int num=0;
while(x)
{
a[++num]=x%10;
x/=10;
}
return dfs(num,0,1);
}
int main()
{
int n,m;
while(cin>>n>>m&&n+m)
{
memset(dp,-1,sizeof(dp));
int ua;
ua=solve(m)-solve(n-1);
cout<<ua<<endl;
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/jiuren/p/10632846.html
今日推荐