【发布时间】:2017-01-28 01:13:53
【问题描述】:
给定任意数 n,并对 n 进行三个操作:
- 加1
- 减1
- 如果是偶数,则除以 2
我想找到将 n 减少到 1 的上述操作的最小数量。我尝试了动态编程方法,也尝试了带有修剪的 BFS,但 n 可能非常大(10^300),我不知道如何让我的算法更快。贪心方法(如果是偶数则除以 2,如果奇数则减去 1)也不会给出最佳结果。是否存在其他解决方案?
【问题讨论】:
-
The greedy approach ... does not give the optimal result...你能给出一个不是最优的数字吗? -
15,贪心会给出 6 (14 -> 7 -> 6 -> 3 -> 2 -> 1) 但最佳是 5 (16 -> 8 -> 4 -> 2 -> 1 )
-
听起来你想尽可能接近 2 的幂。
-
做一个贪心方法的变种,但在每一步检查是否更快地得到最接近的 2 的幂并除以 1。
-
问题陈述需要更清楚。您想要上述操作的最小数量,但我可以使用其他操作(例如,相乘、相加)来计算最小步数吗?
标签: algorithm math dynamic-programming