【问题标题】:Dynamic Programming approach issue动态规划方法问题
【发布时间】:2021-09-01 13:00:28
【问题描述】:

Alice 每天都会慢跑 N 米。有时她跑,有时她走路。她的步行速度是1m/s,跑步速度是2m/s。给定她慢跑的距离,计算她可以慢跑的方式数。

示例:

输入:3(慢跑时跑过的总距离)

输出:3(可能的情况)

说明: 爱丽丝可以通过 3 种方式慢跑

  1. 爱丽丝步行 3 米
  2. Alice 跑 2 米,然后步行 1 m
  3. Alice 走 1m,然后跑 2m

示例 2:

输入:4

输出:5

解释:爱丽丝可以用 5 种方式慢跑

  1. Alice 步行 4 米
  2. Alice 前走 2 米,然后跑 2 米
  3. Alice 可以跑 2 米,然后步行 2 米
  4. 爱丽丝先走1米再跑2米再走1米
  5. 爱丽丝跑完 4 米

我已经使用以下代码解决了上述问题陈述


from itertools import permutations

n = int(input())

c = 0
t = [2]*(n//2)
if n % 2 != 0:
    t = t+[1]

for i in range(t.count(2)):
    c = c+len(set(list(permutations(t, len(t)))))
    t.remove(2)
    t.append(1)
    t.append(1)
c = c+len(set(list(permutations(t, len(t)))))
print(c)

我是动态编程的新手,任何人都可以帮助我吗?我如何在动态方法中实现这一点并实现更优化的时间复杂度?

非常感谢您为我的问题提供宝贵的意见。

【问题讨论】:

  • 我不明白问题陈述。爱丽丝必须选择一个米数a 步行和一个米数b 跑步,这样a+b=N?只有N+1 的可能性。这里不需要任何算法,直接返回N+1即可。
  • 我不明白你举的例子。为什么在这种情况下输出3 而不是4?你忽略了爱丽丝跑了 3 米的解?
  • “她的步行速度是 1m/s,跑步速度是 2m/s。” 这些信息是否与问题相关?怎么样?
  • 这个问题似乎和“有多少种方法可以向上走 N 步,一次走 1 或 2 步”一样,答案是 fib(N+1)
  • 问题的缺失部分似乎是不成文的假设,即 Alice 只能在整数秒边界处行走和奔跑。

标签: python combinations dynamic-programming permutation


【解决方案1】:

受所有早期帖子的启发,并且不成文的假设得到证实,这只是另一个fib-sequence问题。

感谢所有早期的海报。 (代码很简单)仅供参考 - 希望对您有所帮助。

def jogging_ways(n: int) -> int:
    # f(3) = f(1) + f(2)
    a, b = 1, 1
        
    for i in range(n):
        a, b = b, a+b
        #print(a, b)
        
    return a

跑步:

> jogging_ways(4)
  5
> jogging_ways(5) 
  8

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 2012-04-09
    • 2011-01-15
    • 1970-01-01
    • 2011-10-14
    • 2021-02-25
    相关资源
    最近更新 更多