POJ 1850 Code

        组合数学题。

        给你一个序列,并给其编号,如

a - 1 
b - 2 
... 
z - 26 
ab - 27 
... 
az - 51 
bc - 52 
... 
vwxyz - 83681 


        题目给出一个字符串,求这个字符串的编号。若不合法 (字符不递增),则输出0.

        解法:求出排在这个字符串之前有多少个串,然后+1就是答案。因为这个字符串必须递增,设a[i][j],i为'z'-当前字符,j为后面还剩余的位数,由组合数学的知识,a[i][j]=C(i,j)。所以对于一个字符串来说,在他之前字符串的数量就是,长度小于该串以及,每一位上比前一位字符大,比当前字符小的字符为c,的a['z'-c][len-i-1].

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int C[30][30];
int main()
{
    int i,j,l,ans;
    char str[12],ite;
    C[0][0] = 1;
    for (i=1; i<30; i++)
    {
        for (j=0; j<=i; j++)
            C[i][j]=(j == 0)?C[i-1][j]:C[i-1][j-1]+C[i-1][j];
    }
    scanf("%s",str);
    l=strlen(str);
    for (i=1; str[i] != '\0'; i++)
    {
        if (str[i-1] >= str[i])
        {
            printf("0\n");
            return 0;
        }
    }
    ite='a';
    ans=0;
    for (i=1; i<l; i++)
    {
        ans+=C[26][i];
    }
    for (i=0; str[i] != '\0'; i++)
    {
        while (ite < str[i])
        {
            ans+=C['z'-ite][l-i-1];
            ite++;
        }
        ite=str[i]+1;
    }
    printf("%d\n",ans+1);


}


你可能感兴趣的:(POJ 1850 Code)