LOJ #10164. 「一本通 5.3 例 2」数字游戏
题目描述
输入格式
输出格式
样例
数据范围与提示
思路
数位DP入门题
代码:
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a,b;
int f[20][20];
vector<int> d;
int dfs(int pos,int sta,int don) {
if(pos==-1)
return 1;
if(!don&&~f[pos][sta])
return f[pos][sta];
int res=0;
int end=don?d[pos]:9;
for(int i=sta; i<=end; i++)
res+=dfs(pos-1,i,don&&i==end);
if(!don)
f[pos][sta]=res;
return res;
}
long long solve(int num) {
memset(f,-1,sizeof(f));
d.clear();
while(num>0) {
d.push_back(num%10);
num/=10;
}
return dfs(d.size()-1,0,1);
}
int main() {
while(~scanf("%d%d",&a,&b))
printf("%lld\n",solve(b)-solve(a-1));
return 0;
}

浙公网安备 33010602011771号