#include<bits/stdc++.h>
using namespace std;
int a[50];
int dp[50][50];
int dfs(int num, ,bool limit) //位数,传递条件 ,上界判断
{
if(num==-1)return 0; //最后一位时,根据情况返回1或0
if(!limit && dp[num][ ]!=-1) //已经走过此种状态
return dp[num][ ];
int ans=0; //计数
int up=limit?a[num]:9; //上界
for(int i=0;i<=up;i++){
ans+=dfs(num-1, ,limit && i== up);//传递
}
if(!limit) //判断是否可以储存
dp[num][ ]=ans;
return ans;
}
int solve(int x) //将x拆开存入a数组
{
int num=0;
while(x){
a[num]=x%b; //b表示进制!!!
num++;
x/=b;
}
return dfs(num-1, ,true);//传递
}
int main()
{
int l,r;
while(scanf("%d%d",&l,&r)!=EOF)
{
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(r)-solve(l-1));
}
return 0;
}
数位DP模板
最新推荐文章于 2018-09-02 09:46:40 发布