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].
给你一个序列,并给其编号,如
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); }
相关文章推荐
- POJ 1850 Code
- Code(POJ--1850
- POJ 题目1850 Code(组合数学)
- Poj 1496 Word Index & Poj 1850 Code (计数 组合数)
- POJ 1850 Code
- poj 1850 Code
- POJ 1850 Code 数位DP
- POJ - 1850 Code
- poj:1850 Code(组合数学?数位dp!)
- POJ - 1850 Code(组合数学推公式)
- poj 1850 Code(同 poj 1496 Word Index)
- POJ1850——Code
- 组合数学 POJ 1850 Code
- POJ1850——Code
- POJ1850——Code(组合数)
- poj1850--Code(组合篇2)
- 【poj 1850】Code 题意&题解&代码(C++)
- POJ 1850 Code
- POJ 1850 Code 统计问题
- POJ 1850Code(组合数学)