POJ1850Code

题目:http://poj.org/problem?id=1850

略模拟,思路见代码。关键是思路清晰,转化为代码的能力。

#include<iostream>
#include<cstdio>
using namespace std;
char c;
int a[15],len;
long long s[15][30],sum;
void yun()
{
    for(int i=1;i<=26;i++)
        s[1][i]=1;
    for(int i=2;i<=len;i++)
        for(int j=26-i+1;j;j--)
            s[i][j]=s[i][j+1]+s[i-1][j+1];
}
void pls1()
{
    for(int i=1;i<=len;i++)//a的位数
        for(int j=a[i-1]+1;j<a[i];j++)//+的首字母
            sum+=s[len-i+1][j];
}
void pls2(int cur)
{
    for(int i=1;i<=26-cur+1;i++)
        sum+=s[cur][i];
}
int main()
{
    while(scanf("%c",&c)==1)
    {
        if(c=='
')break;
        a[++len]=(int)c-96;
        if(a[len]<=a[len-1])
        {
            printf("0");
            return 0;
        }
    }
    yun();
    for(int i=1;i<len;i++)
        pls2(i);
    pls1();
    printf("%lld",sum+1);
    return 0;
}
原文地址:https://www.cnblogs.com/Narh/p/8439893.html