poj 1850 Code(同 poj 1496 Word Index)
2014-08-01 10:10
337 查看
Language: Code
Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made only of small characters of the English alphabet a,b,c, ..., z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character). The coding system works like this: • The words are arranged in the increasing order of their length. • The words with the same length are arranged in lexicographical order (the order from the dictionary). • We codify these words by their numbering, starting with a, as follows: 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 this coding 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 the word can not be codified. Sample Input bf Sample Output 55 Source Romania OI 2002 题意很简单,不过自己递推了好久都没推出来。看了别人的题解,有的是DFS有的是DP,不过觉得正确的姿势是组合计数吧。 根据串的长度分别计数: len num 1 C(26,1) 2 C(26,2) 3 C(26,3) ... 利用杨辉三角求出组合表C[][] 接下来就是统计了 第一步:统计比当前串长度小的个数 第二步: 统计长度等于当前串且比当前串小的串的个数 第三步:sum值加一,加上当前串。 代码: <pre class="sh_cpp sh_sourceCode" style="font-family:Courier New,Courier,monospace"><span class="sh_preproc"></span> #include<stdio.h> #include<string.h> char s[10]; int c[30][30]; int main() { for(int i=0;i<=26;i++) { for(int j=0;j<=i;j++) { if(!j||j==i) c[i][j]=1; else c[i][j]=c[i-1][j]+c[i-1][j-1]; } } c[0][0]=0; while(~scanf("%s",s)) { int len=strlen(s); int sum=0; int ok=1; for(int i=1;i<len;i++) { if(s[i-1]>=s[i]) { ok=0; printf("0\n"); break; } } if(ok) { sum=0; for(int i=1;i<len;i++) sum+=c[26][i]; //printf("%d ",sum); for(int i=0;i<len;i++) { char tmp; if(!i) tmp='a'; else tmp=s[i-1]+1; while(tmp<=s[i]-1) { sum+=c['z'-tmp][len-i-1]; tmp++; } } printf("%d\n",sum+1); } } return 0; } |
相关文章推荐
- 排列组合:poj 1496 Word Index+poj 1850 Code
- POJ 1496 Word Index || POJ 1850 Code
- Poj 1496 Word Index & Poj 1850 Code (计数 组合数)
- POJ 1850 Code/POJ 1496 Word Index(组合数学-字母串序号)
- POJ 1850 Code ,1496 Word Index(组合计数)
- POJ 1850 Code POJ 1496 Word Index
- POJ 1850 Code POJ 1496 Word Index
- poj1496—Word Index(组合数)
- [ACM] poj 1496 Word Index(组合计数)
- POJ 1496 Word Index
- [ACM] poj 1496 Word Index(组合计数)
- POJ 1496 Word Index
- POJ 1496 Word Index 和POJ 1850 Code 动态规划
- POJ 1496 Word Index 笔记
- poj 1850 Code 1496 Word Index
- POJ 1496 Word Index (组合数学 求字符串对应编码)
- POJ1496-Word Index
- POJ 题目1496 Word Index(排列组合)
- poj 1496 Word Index
- [ACM] poj 1496 Word Index(组合计数)