Code POJ

来源:互联网 发布:淘宝网抛光砖颜色大全 编辑:程序博客网 时间:2024/06/04 18:06

要求后一位比前一位的字典序大,统计它是满足这个条件的数的第几个,数位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;}