要求后一位比前一位的字典序大,统计它是满足这个条件的数的第几个,数位dp,d[pos][pre] 统计到pos位,前一项是pre的个数。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
const double EPS = 1e-7;
typedef long long ll;
ll d[15][27];
char s[15];
int bit[15];
int dfs(int cnt,int pre,int limit,int lead){
if(cnt==-1&&lead) return 1;
if(!limit&&d[cnt][pre]!=-1) return d[cnt][pre];
int up=limit?bit[cnt]:26;
ll ans=0;
int i=pre+1;
if(!lead) i=0;
for(;i<=up;i++){
ans+=dfs(cnt-1,i,limit&&i==up,i);
}
if(!limit) d[cnt][pre]=ans;
return ans;
}
int main(){
memset(d,-1,sizeof(d));
while(scanf("%s",s)!=EOF){
int len=strlen(s);
int flag=0;
for(int i=0;i<len-1;i++){
if(s[i+1]<=s[i]){
flag=1;
break;
}
}
if(flag){
printf("0\n");
continue;
}
for(int i=0;i<len;i++){
bit[len-1-i]=s[i]-'a'+1;
}
ll ans=dfs(len-1,-1,1,0);
printf("%lld\n",ans );
}
return 0;
}