标签:continue fine printf 数位dp max 数位 long ems 限制
http://acm.hdu.edu.cn/showproblem.php?pid=2089
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
const int maxn = 200100;
int n,m;
int num[20];
int dp[20][2]; //dp[i][j] i记录位的位置,j记录前边是不是6
int dfs(int idx,bool pre,bool limit) //pre记录第idx位前边是不是6 //当前位有没有限制? 首位一定有限制
{
if(idx<0) return 1;
if(!limit && dp[idx][pre]!=-1) return dp[idx][pre];
int ans=0;
int up=limit?num[idx]:9; //当前位取值
for(int i=0;i<=up;i++) //遍历当前位的所有可能
{
if(i==4 || pre&&(i==2)) continue;
else ans+=dfs(idx-1,i==6,limit&&i==num[idx]);
}
if(!limit) dp[idx][pre]=ans;
return ans;
}
int solve(int val)
{
int len=0;
while (val)
{
num[len++]=val%10;
val/=10;
}
return dfs(len-1,0,1);
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n&&m))
{
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(m)-solve(n-1));
}
return 0;
}
标签:continue fine printf 数位dp max 数位 long ems 限制
原文地址:https://www.cnblogs.com/chilkings/p/11979503.html