poj 1850 code(组合数学)

时间:2024-03-27 15:03:50

题目:http://poj.org/problem?id=1850

题意:按给定的规则给字母编号。

一个很简单的题目,但是却做了好久。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int c[][];
void init()//用杨辉三角的方法求组合数,C(n,m)
{
int i,j;
for(i=; i<=; i++)
c[i][]=c[i][i]=;
for(i=; i<=; i++) //这里记杨辉三角的第一行第一个为C(0,0)
for(j=; j<i; j++)
c[i][j]=c[i-][j-]+c[i-][j];
}
int main()
{
int f=,k,i,j,sum=,x;
char s[];
init();
cin>>s; k=strlen(s);
for(i=; i<k-; i++)
if(s[i]>s[i+])
{
f=; break;
}
if(f==)
{
for(i=; i<=k-; i++)
sum+=c[][i]; //小于位数的所有个数
for(i=; i<k; i++)
{
if(i==) x='a';
else x=s[i-]+;
for(j=x; j<s[i]; j++)//核心代码,只可意会不可言传了、、、、
sum+=c['z'-j][k-i-];
}
cout<<sum+<<endl;//加本身
}
else
cout<<""<<endl;
return ;
}