zoukankan      html  css  js  c++  java
  • POJ1850:Code(组合计数) java程序员

    Code
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 6374   Accepted: 2987

    Description

    Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made only of small characters of the English alphabet a,b,c, ..., z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character).

    The coding system works like this:
    • The words are arranged in the increasing order of their length.
    • The words with the same length are arranged in lexicographical order (the order from the dictionary).
    • We codify these words by their numbering, starting with a, as follows:
    a - 1
    b - 2
    ...
    z - 26
    ab - 27
    ...
    az - 51
    bc - 52
    ...
    vwxyz - 83681
    ...

    Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code.

    Input

    The only line contains a word. There are some constraints:
    • The word is maximum 10 letters length
    • The English alphabet has 26 characters.

    Output

    The output will contain the code of the given word, or 0 if the word can not be codified.

    Sample Input

    bf

    Sample Output

    55

    Source

    MYCode:
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    typedef long long LL;
    LL c[27][27];
    char str[15];
    void make()
    {
        c[1][0]=1;
        c[1][1]=1;
        int i,j;
        for(i=2;i<=26;i++)
        {
            c[i][0]=c[i][i]=1;
            for(j=1;j<i;j++)
            {
                c[i][j]=c[i-1][j-1]+c[i-1][j];
            }
        }
    }
    int main()
    {
        make();
        while(scanf("%s",&str)!=EOF)
        {
            int i,j;
            bool flag=true;
            int len=strlen(str);
            for(i=1;i<len;i++)
            {
                if(str[i]<=str[i-1])
                {
                    flag=false;
                    break;
                }
            }
            if(flag==false)
            {
                printf("0\n");
                continue;
            }
            LL sum=0;
            for(i=1;i<len;i++)
            {
                sum+=c[26][i];
            }
            //cout<<"sum="<<sum<<endl;
            for(i=0;i<len;i++)
            {
                int lt,rt;
                if(i!=0)
                lt=str[i-1]-'a'+2;
                else
                lt=1;
                rt=str[i]-'a';
                for(j=lt;j<=rt;j++)
                {
                    sum+=c[26-j][len-1-i];
                }
                //cout<<"sum="<<sum<<endl;
            }
            //printf("%lld\n",sum+1);
            cout<<sum+1<<endl;
        }
    }
    //
    组合计数问题,注意利用杨辉三角求组合数,sum以及c[][]数组用LL类型.
  • 相关阅读:
    ExtJS学习之路第一步:对比jQuery,认识ExtJS
    创建Windows服务(C++)
    吴恩达2014机器学习教程笔记目录
    在Hexo中渲染MathJax数学公式
    Linux服务器性能检测命令集锦
    Redis开启AOF导致的删库事件
    从表扩展增加列属性说起
    数据库规约解读
    MySQL规约(阿里巴巴)
    HDFS运行原理
  • 原文地址:https://www.cnblogs.com/java20130725/p/3215886.html
Copyright © 2011-2022 走看看