数位dp入门题。
网络流做多了,来一道数位dp题换一换脑子。
这题就是个板子题。
直接按照题意数位dp就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
int len,num[11],f[11][10];
inline int dfs(int pos,int las,bool lim){
if(pos==len+1)return 1;
if(~f[pos][las]&&!lim)return f[pos][las];
int up=lim?num[pos]:9,ret=0;
for(int i=las;i<=up;++i)ret+=dfs(pos+1,i,lim&&i==up);
if(!ret)f[pos][las]=ret;
return ret;
}
inline int solve(int x){
memset(f,-1,sizeof(f));
if(!x)return 1;
len=0;
while(x)num[++len]=x-x/10*10,x/=10;
return reverse(num+1,num+len+1),dfs(1,0,1);
}
int main(){
int a,b;
while(~scanf("%d%d",&a,&b))printf("%d\n",solve(b)-solve(a-1));
return 0;
}