题意:
在所有位数上,没有3,8,询问数字个数。(之前读错题了。。写了发数位DP。。)
思路:
也没什么好标记的,数位DP。。连个状态都没。。
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll digit[100];
ll dp[15];
ll dfs(int len,bool isLimit)
{
if(!isLimit&&dp[len]!=-1)
return dp[len];
if(len<=0)
return 1;
int last=(isLimit==1?digit[len]:9);
ll ans=0;
for(int i=0;i<=last;i++)
{
// if(len>=6&&len<=8 || len<=3&&len>=1 )
if(i==3||i==8) continue;
ans+=dfs(len-1,isLimit&&i==last);
}
if(!isLimit)
dp[len]=ans;
return ans;
}
ll solve(ll n)
{
int cnt=0;
while(n)
{
digit[++cnt]=n%10;
n/=10;
}
return dfs( cnt,true);
}
int main()
{
memset(dp,-1,sizeof dp);
ll n;
while(~scanf("%lld",&n),n)
{
printf("%lld: ",n);
printf("%lld\n",solve(n)-1);
}
}