一救援机器人有三种跳跃模式,可分别跳跃1m,2m,3m的距离,请用程序实现该机器人行进n米路程时可用的跳跃方式。
程序语言不限,当距离n值足够大时,程序执行时间尽量小。
例:当距离为4米时,输出结果有7种:
1m,1m,1m,1m
1m,1m,2m
1m,2m,1m
1m,3m
2m,1m,1m
2m,2m
3m,1m
Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
谢谢邀请。
出这道题,明显是为了考察你 DP。我也不多说,直接放码过来了:
当
n == 4
的时候,调用:step(4, "");
原样输出你想要的。这里只是用最短的代码表述我的思路,怕爆栈的,自行修改。
It is quite similar to my Facebook interview question: a game has 3 levels of scores: 1 point, 2 points, 5 points. please print all the ways you can get 10 points.
简单想了一下,这道题目优化思路和斐波那契数列的优化思路相同:记录f(n)。
根据题目可知f(n)=f(n-1)+f(1)=f(n-2)+f(2)=f(n-3)+f(3)=f(1)+f(n-1)=..
手机码字后面两个等式就不写了。
f(n)的可能也就这6种(当然肯定包含重复)
那么一点点推导f(4)因为f123已知,f4可以在O(1)内得到,记录。
f5,此时f1234已知,f5也能在O(1)得到,记录。
那么f(n),根据上述的公式,可以在O(n)内得到。
这是大致思路,接下来解决重复问题就行了。
根据 @AUV_503516 的思路, 写以下代码, 存储结构和空间还可以优化
用C写了一段:
运行结果:
好吧,原来是要详细列出每种方法的方案,我没认真看…… =_,=b
直接采用递归的话会有很多重复的计算,比如在n=7的时候,会有1+1+1+steps(4),1+2+steps(4),3+steps(4),所以step(4)会被重复计算多次。因此在需要做记忆之前的结果
写个For循环算了,
这也就OI初中组的水平......典型的动态规划一点儿弯儿都没绕
这也就是考递归的问题.
如果是要求一共有多少种方法,就可以简单用一位数组做动态规划。如果要求输出所有解,就老老实实的求吧。代码用递归写的。