美文网首页
编程笔试-上台阶问题

编程笔试-上台阶问题

作者: 飞机大河马 | 来源:发表于2018-10-10 16:42 被阅读0次

    题目

    已知从山脚到山顶共有m个台阶,一次可爬a-b个台阶,由于年久失修,部分台阶已坏无法站立,已知坏的台阶共有n个并给出所在位置,问共有多少种登山方案(如果无法登山山顶返回0,结果大于10^9+7则对其取模)?

    输入描述

    台阶总数m,一次最少可爬台阶数a,一次最大可爬台阶数b,坏掉的台阶n,之后n行为坏掉台阶的编号,编号从1开始。

    输出描述

    一个数字,代表登山方案的个数

    解题思路

    思路一:暴力法

    枚举所有的登山方案,得到可行的登山方案个数。

    思路二:动态规划

    为了方便说明,将原问题转化为3个难度递增的小问题进行逐一解决。

    1. m级台阶,一次最多可爬1-b个,有多少种登山方案?
    2. m级台阶,一次最多可爬a-b个,有多少种登山方案?
    3. m级台阶,n级损坏,一次最多可爬a-b个,有多少种登山方案?

    问题1

    令f(m,b)表示登山方案的个数,第一步可以跨1-b个台阶,若登上1个台阶,则余下的方案个数为f(m-1,b);若登上k个台阶,则余下的方案个数为f(m-k,b)个,因此可以得到f(m,b)=f(m-1,b)+f(m-2,b)+...+f(m-b,b),其中m<=0时,f(m,b)=0,m=1时,f(m,b)=1,m=b时,f(m,b)=f(m,b-1)+1。

    input_m = 100
    input_b = 2
    solution_table = {}
    
    
    def get_solutions(m, b):
        if m <= 0 or b <= 0:
            return 0
        elif m == 1:
            return 1
        elif m == b:
            if (m, b) in solution_table:
                solution = solution_table[(m, b)]
            else:
                solution = get_solutions(m, b - 1) + 1
                solution_table[(m, b)] = solution
            return solution
        else:
            if (m, b) in solution_table:
                solution = solution_table[(m, b)]
            else:
                solution = sum(get_solutions(m - i - 1, b) for i in range(b))
                solution_table[(m, b)] = solution
            return solution
    
    
    result = get_solutions(input_m, input_b)
    result = result % 1000000007
    print(result)
    

    问题2

    令f(m,a,b)表示登山方案的个数,第一步可以跨a-b个台阶,若登上a个台阶,则余下的方案个数为f(m-a,a,b);若登上k个台阶,则余下的方案个数为f(m-k,a,b)个,因此可以得到f(m,a,b)=f(m-a,a,b)+f(m-a-1,a,b)+...+f(m-b,a,b)。

    input_m = 100
    input_a = 2
    input_b = 5
    solution_table = {}
    
    
    def get_solutions(m, a, b):
        if m - a < 0:
            return 0
        elif m == a:
            return 1
        elif m >= a + b:
            if (m, a, b) in solution_table:
                solution = solution_table[(m, a, b)]
            else:
                solution = 0
                for i in range(a, b + 1):
                    solution += get_solutions(m - i, a, b)
                solution_table[(m, a, b)] = solution
        else:
            if (m, a, b) in solution_table:
                solution = solution_table[(m, a, b)]
            else:
                solution = 0
                for i in range(a, b + 1):
                    if m - i > 0:
                        solution += get_solutions(m - i, a, b)
                    elif m - i == 0:
                        solution += 1
                    else:
                        break
                solution_table[(m, a, b)] = solution
        return solution
    
    
    result = get_solutions(input_m, input_a, input_b)
    result = result % 1000000007
    print(result)
    

    相关文章

      网友评论

          本文标题:编程笔试-上台阶问题

          本文链接:https://www.haomeiwen.com/subject/focpaftx.html