FZU 2113 BCD Code 数位dp

时间:2021-07-09 14:32:11

数位dp,但是很奇怪的是我在虚拟oj上用GUC C++提交会wa,用Visual c++提交正确,但是加上注释后提交又莫名CE……好任性啊 0 ,0

题目思路:看代码吧 注释很详细

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<map>
#define INF 0x3f3f3f3f
#define MAX 1000005
#define Temp 1000000000

using namespace std;

long long dp[20][20];
int num[20];

long long dfs(int pos,int sum,int limit)
{
if(pos<0)//若pos小于0结束dfs
return sum;
if(!limit && dp[pos][sum]!=-1)//若dp里保存的是完整且无限制的数,返回dp值
return dp[pos][sum];
int len=limit?num[pos]:9;//若有限制,len=当前位置的数,否则len=9
long long ans=0;
for(int i=0;i<=len;i++)
{
if(i==1)//若i==1,则sum+1,若当前位置有限制且当前位置填的数为能填的最大值则下一次dfs也有限制,否则无限制
ans+=dfs(pos-1,sum+1,limit&&i==len);
else
ans+=dfs(pos-1,sum,limit&&i==len);
}
if(!limit)//DP里保存完整的、取到尽头的数据
dp[pos][sum]=ans;
return ans;
}

long long solve(long long a)
{
int len=0;
memset(num,-1,sizeof(num));
memset(dp,-1,sizeof(dp));
while(a)
{
num[len++]=a%10;
a/=10;
}
return dfs(len-1,0,1);
}

int main()
{
long long a,b;
while(scanf("%lld%lld",&a,&b)!=EOF)
{
long long ans=solve(b)-solve(a-1);
printf("%I64d\n",ans);
}
return 0;
}