ACM: 一题组合数学题  poj1850 (头…

来源:互联网 发布:淘宝网店加盟哪家好 编辑:程序博客网 时间:2024/05/19 02:05

 

                                                                             Code

Description

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

The coding system works like this:
• The words are arranged in the increasing order of theirlength.
• The words with the same length are arranged in lexicographicalorder (the order from the dictionary).
• We codify these words by their numbering, starting with a, asfollows:
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 thiscoding 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 theword can not be codified.

Sample Input

bf

Sample Output

55 

题意: 给出一段字符串,计算相应的合法组合.(定义在上文给出:规定后面的字母都比前面的大)

个人思路:

             1.把计算分段result = f(1)+f(2)+f(3)+...+f(i) (f(i)是计算字符串有i位时的全部合法组合)

              2.计算f(len-1)~ 到当前的数值.

     例如 abe: 先计算f(1)+f(2)+(abc)~(abe) (后面部分就是2中描述:(abc)表示是三位的开始)

              3.f(i)的累加和求法很多.(等差数列求和)或者(排列组合)都行.难算的是2描述的部分.

              4.现在要考虑的是str[i]< str[i+1],循环求得时候要先求出当前这一位的最小开始字母.

     例如第一位:a 第二位:b 第三位:c .... 这个是循环计数的关键.

   (别忘了最后要+1,原因:字符串a从0开始) 

 

代码:

#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
#define MAX 27

int c[MAX][MAX];

void zuhe()
{
       int i , j;
       memset(c,0,sizeof(c));
       for(i = 0; i < 27; ++i)
     {
             c[i][0] = 1;
             for(j = 1; j <= i; ++j)
                  c[i][j] = c[i-1][j] + c[i-1][j-1];
      }
}

int main()
{
         zuhe();
         char num[MAX];

         while(scanf("%s",num) != EOF)
        {
               int flag = 1;
               int result = 0;
               int len = strlen(num);
               int i , j;

               for(i = 0; i < len; ++i)
              {
                     for(j = i+1; j < len; ++j)
                    {
                          if(num[i] >= num[j])
                        {
                             flag = 0;
                    }
              }
               if(flag == 0)
                      break;
              }

              if(flag == 0)
             {
                     printf("0\n");
             }
             else
            {
                    for(i = 1; i < len; ++i)
                   {
                          result += c[26][i];
                   }

                  char tt;
                  for(i = 0; i < len; ++i)
                 {
                       if(i == 0)
                     {
                           tt = 'a';
                     }
                     else
                    {
                           tt = num[i-1] + 1;
                    }
                     for(j = tt; j < num[i]; ++j)
                    {
                             result += c['z'-j][len-i-1];
                     }
               }

              printf("%d\n",result+1);
          }
      }

    return 0;
}

0 0
原创粉丝点击