用于实现原始计算器的动态编程解决方案

时间:2017-08-30 22:32:08

标签: algorithm dynamic-programming

这是Coursera上的算法工具箱课程中的一个问题。问题描述如下:

您将获得一个原始计算器,可以使用当前数字执行以下三个操作 x:将x乘以2,将x乘以3,或将x加1。你的目标给出一个正整数n,找到 从数字1开始获取数字n所需的最小操作次数。

我实现了一个递归解决方案并使用了memoization,并设法解决了一些测试用例,但我一直在失败(他们不告诉我哪个输入失败了)。

这是我的解决方案: https://codeshare.io/aYWoPL

我不知道,为什么我的代码没有像预期的那样工作。我不希望你给我代码,如果我愿意的话,我可以在网上找到它,我只是想知道为什么我的代码不能正常工作!提前谢谢。

我搜索了之前的问题,但没有找到令人满意的解决方案,很抱歉,如果这对你们中的某些人来说是重复的。

1 个答案:

答案 0 :(得分:0)

不确定为什么你有特殊情况n == 10,还有重复的陈述。但真正重要的错误是else if的使用 - 数字可以是 32的倍数。您需要在所有三个操作中采取所需的最少步骤:

long long numOp (int n, long long num_operations[]) {
   if (n <= 1) return 0;

   if (num_operations[n - 2] > 0)
      return num_operations[n - 2];

   long long min = numOp(n - 1, num_operations);
   if (n % 3 == 0) {
      long long temp = numOp(n / 3, num_operations);
      if (temp < min) min = temp;
   }
   if (n % 2 == 0) {
      long long temp = numOp(n / 2, num_operations);
      if (temp < min) min = temp;
   }

   return (num_operations[n - 2] = 1 + min);
}