zoukankan      html  css  js  c++  java
  • 字典序问题 算法实现题1-2

    字典序问题 算法实现题1-2

    题意

    《计算机算法设计与分析》第8页。

    在数据加密和数据压缩中需要对特殊的字符串进行编码。给定的字母表由26个小写字母组成。该字母表产生的升序字符串是指字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc, xyz等都是升序字符串。

    他们有对应的序号:

    1 2 …… 26 27 28 ……
    a b …… z ab ac ……

    题解思路

    课后习题答案

    代码实现

    #include<bits/stdc++.h>
    using namespace std; 
    const int MAXN = 26;
    const int MAXL = 6;
    int ff[MAXN+1][MAXL+1];
    int gg[MAXL+1];
    //多加了一个记忆化 
    int f(int ch,int len)
    {
        int index=0;
        if(ff[ch][len]!=0)
    		return ff[ch][len];
        if(len==1)
            return ff[ch][1] = 1;
        for(int i=ch+1; i<=27-len; i++)
            index+=f(i,len-1);
        return index;
    }
    int g(int len)
    {
        int index=0;
        if(gg[len]!=0)
        	return gg[len];
        for(int ch=0;ch<=26-len;ch++)
            index+=f(ch,len);
        return index;
    }
     
    int main()    
    {
        int i,k;
        int ch;
        char str[7];
        //先进行初始化 
        fill(ff[0], ff[0]+MAXN*MAXL, 0);
        fill(gg, gg+MAXL, 0); 
        while(scanf("%s", str)!=EOF){
    	    int pos=0;
    	    for(i=1;i<strlen(str);i++)
    	        pos+=g(i);
    	    for(ch=0;ch<str[0]-'a';ch++)  
    	        pos+=f(ch,strlen(str));
    	    for(k=1; k<strlen(str); k++)
    	        for(ch=str[k-1]-'a'+1; ch<str[k]-'a'; ch++)
    	            pos+=f(ch,strlen(str)-k);
    	    printf("位置是:%d
    ",pos+1);
    	}
        return 0;
    }
    
  • 相关阅读:
    40 修改了机器名,portal重装后,还需要做什么?
    39 路径分析小练习
    38 空间查询小练习
    面向对象一些概念简述
    Js函数基本介绍
    JS中的变量和数据类型
    js基础语法
    Css样式优先级
    对响应式布局的理解和认知
    关于Flex布局
  • 原文地址:https://www.cnblogs.com/alking1001/p/13346692.html
Copyright © 2011-2022 走看看