POJ 1850 Code

来源:互联网 发布:算法1mints.txt 编辑:程序博客网 时间:2024/05/29 19:10

        组合数学题。

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

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);}