HDU 2089 不要62
状态表示:
dp[len][sta]表示当前第len位,上一位为last的情况下满足条件的数的个数。
int f[15][10];
int a[15];
int l,r;
int dfs(int len,int last,bool limit)
{
if(!len) return 1;
if(!limit && ~f[len][last]) return f[len][last];//如果没有限制且已求解,则直接返回,无需递归。
int num=limit?a[len-1]:9;
int res=0;
for(int i=0;i<=num;i++)
{
if(last == 6 && i == 2) continue;
if(i == 4) continue;
res+=dfs(len-1,i,limit&&i==num);
}
if(!limit) f[len][last]=res;
return res;
}
int dp(int x)`//求解[0...x]之间满足条件的个数 `
{
int len=0;
while(x)
{
a[len++]=x%10;
x/=10;
}
return dfs(len,0,1);`//如果不包括0,此处减1即可`
}
int main()
{
memset(f,-1,sizeof f);
while(cin>>l>>r,l+r)
{
cout<<dp(r)-dp(l-1)<<endl;
}
//system("pause");
return 0;
}