poj 1850

递推,统计,数位DP水题,但这题在网上归为组合数学,不知道思路

#include <iostream>
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std;
LL f[11][30];
int main()
{
    char s[11];
    int i,j,k;
    for(i=0;i<26;i++) f[0][i]=1;
    for(i=1;i<10;i++)
    {
        for(j=0;j<(26-i);j++)
        {
            f[i][j]=0;
            for(k=j+1;k<(26-i+1);k++)
            {
                f[i][j]+=f[i-1][k];
            }
        }
    }
    while(cin>>s)
    {
        int l=strlen(s);
        LL ans=0;
        for(i=0;i<l-1;i++)
        {
            for(j=0;j<(26-i);j++) ans+=f[i][j];
        }
        for(i=0;i<l;i++)
        {
            if(i==0) j=0;
            else
            {
                if(s[i]<=s[i-1]) break;
                j=(s[i-1]-'a')+1;
            }
            for(;j<(s[i]-'a');j++)
            {
                ans+=f[l-1-i][j];
            }
        }
        if(i==l) printf("%I64d\n",ans+1);
        else printf("0\n");
    }
    return 0;
}



原文地址:https://www.cnblogs.com/lj030/p/3065560.html