poj 1850 Code 递推

来源:互联网 发布:2017中超守门员数据 编辑:程序博客网 时间:2024/05/29 19:13
题目意思简单明了,求由小写字母组成的数列的顺序号 
a - 1 
b - 2 
... 
z - 26 
ab - 27 
... 
az - 51 
bc - 52
思路: 非常直接的做法 从最高位开始,求出把该位减小后能得到的数列数,最后再加上位数比他小的那些数列数目。

#include
#include
#include
using namespace std;
long  long ans;
char a[101];

long long work(int a,int b)
{
    long long sum=1;
    for(inti=a;i>=1;i--)
    sum*=b--;
    for(inti=a;i>1;i--)
    sum/=i;
    return(sum);
}

int main()
{
   scanf("%s",&a[1]);
    intlon=strlen(&a[1]);
    int ff=0;
    for(inti=1;i<=lon;i++)
    {
       if(a[i]-'a'+1<=ff)
       {
          printf("0\n");
          return(0);
       }
       ff=a[i]-'a'+1;
    }

    int tt=0;
    for(inti=1;i<=lon;i++)
    {
       int ll=a[i]-'a';
       for(int j=ll;j>tt;j--)
       ans+=work(lon-i,26-j);
       tt=ll+1;
    }
    for(int i=1;i
    {
       ans+=work(i,26);
    }
   printf("%lld\n",ans+1);
    return 0;
}

原创粉丝点击