【发布时间】:2021-09-01 13:00:28
【问题描述】:
Alice 每天都会慢跑 N 米。有时她跑,有时她走路。她的步行速度是1m/s,跑步速度是2m/s。给定她慢跑的距离,计算她可以慢跑的方式数。
示例:
输入:3(慢跑时跑过的总距离)
输出:3(可能的情况)
说明: 爱丽丝可以通过 3 种方式慢跑
- 爱丽丝步行 3 米
- Alice 跑 2 米,然后步行 1 m
- Alice 走 1m,然后跑 2m
示例 2:
输入:4
输出:5
解释:爱丽丝可以用 5 种方式慢跑
- Alice 步行 4 米
- Alice 前走 2 米,然后跑 2 米
- Alice 可以跑 2 米,然后步行 2 米
- 爱丽丝先走1米再跑2米再走1米
- 爱丽丝跑完 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