AcWing1082 数字游戏(数位dp)
同样的套路,这题求的是不降数,只需要在预处理的时候处理一下就行
#include<iostream> #include<vector> using namespace std; const int N=17; int f[N][N]; int n,m; void init(){ int i,j; for(i=0;i<=9;i++){ f[1][i]=1; } for(i=2;i<N;i++){ for(j=0;j<=9;j++){ int k; for(k=j;k<=9;k++){ f[i][j]+=f[i-1][k]; } } } } int dp(int n){ if(!n) return 1; vector<int> num; while(n){ num.push_back(n%10); n/=10; } int i; int res=0; int last=0; for(i=num.size()-1;i>=0;i--){ int x=num[i]; int j; for(j=last;j<x;j++){ res+=f[i+1][j]; } if(x<last) break; last=x; if(!i) res++; } return res; } int main(){ init(); while(cin>>n>>m){ cout<<dp(m)-dp(n-1)<<endl; } }
没有人不辛苦,只有人不喊疼