Acwing 1082 数字游戏[数位dp]
题意
求[X,Y]中的数,满足数字从左到右非下降关系的数的个数,如:123,445.
思路
数位dp经典题。
f[i][j]
表示有i位,并且最高位是j的方案总数。
对于某一位,先枚举该位取
的取法,可以直接算出来,再考虑该位取
的做法。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=35;
int f[maxn][maxn];
inline void init(){
for(int i=0;i<=9;i++)f[1][i]=1;
for(int i=2;i<=maxn;i++)
for(int j=0;j<=9;j++)
for(int k=j;k<=9;k++)
f[i][j]+=f[i-1][k];
}
inline int dp(int n){
if(!n)return 1;
int res=0,last=0;
vector<int> v;
while(n)v.push_back(n%10),n/=10;
for(int i=v.size()-1;i>=0;i--){
int x=v[i];
for(int j=last;j<x;j++)res+=f[i+1][j];//这里i+1是因为i是从0开始,比位数小1
if(x<last)break;
last=x;
if(!i)res++;
}
return res;
}
int main(){
init();
int a,b;
while(cin>>a>>b)cout<<dp(b)-dp(a-1)<<endl;
return 0;
}