您的位置:首页 > 其它

POJ 1850 Code

2012-12-20 15:41 302 查看
组合数学题。

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

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: