使用 C++ 计算设置数字时钟计时器在给定移动和按下成本下的最低成本


在给定移动和按下成本的情况下设置数字时钟计时器可能是一项具有挑战性的任务。在采取适当的方法并理解相关的语法和算法时,减少与设置数字时钟计时器相关的成本被证明是可控的。通过本文,我们将分析语法和算法,同时提供两种使用 C++ 实现最低成本的替代技术。

语法

为了确保对后续代码示例的成功理解,建议首先掌握正在使用的语法,然后再探索算法和方法 -

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// Function declarations (if necessary)

int main() {
   // Variable declarations and initializations

   // Code logic

   return 0;
}

算法

为了实现最低成本,我们需要找到设置数字时钟计时器的移动和按下的最佳顺序。以下是计算最低成本的分步算法 -

  • 读取每个数字的移动成本并将其存储在向量中。

  • 读取每个数字的按下成本并将其存储在另一个向量中。

  • 读取要在数字时钟计时器上设置的目标时间。

  • 初始化一个大小为`(targetTime + 1)`的动态规划表,以存储每个时间值的最低成本。

  • 将表中的初始值设置为无穷大或一个较大的值,除了第 0 个位置,该位置应设置为 0。

  • 对于目标时间中的每个数字,迭代所有从 0 到 9 的可能值。

  • 对于每个值,计算当前数字的移动成本和按下成本。

  • 使用通过将当前移动成本、按下成本和为前一个数字获得的最低成本相加获得的最低成本更新动态规划表。

  • 最后,目标时间的最低成本将存储在动态规划表的最后一个位置。

方法

有两种潜在的解决方案可以解决这个问题 - 采用递归或动态规划方法。仔细检查这两种技术将是有益的。

方法 1:递归方法

在递归方法中,我们将定义一个递归函数来计算最低成本。该函数将当前时间、移动成本、按下成本和当前数字索引作为参数。递归方法涉及重复计算每个可用数字的最小可能值,然后再确定哪个才是真正最优的。

示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int calculateMinimumCostRecursive(vector<int> movement, vector<int> push, int targetTime, int currentDigit) {
   if (currentDigit < 0)
      return 0;

   int minCost = INT_MAX;
   for (int i = 0; i <= 9; i++) {
      int cost = movement[currentDigit] * i + push[currentDigit] + calculateMinimumCostRecursive(movement, push, targetTime / 10, currentDigit - 1);
      minCost = min(minCost, cost);
   }

   return minCost;
}

int main() {
   // Example usage
   vector<int> movement = {5, 4, 3, 2, 1}; // Movement cost for each digit
   vector<int> push = {1, 2, 3, 4, 5};     // Push cost for each digit
   int targetTime = 12345;                 // Target time to set

   int minimumCostRecursive = calculateMinimumCostRecursive(movement, push, targetTime, movement.size() - 1);
   cout << "Minimum cost (Recursive): " << minimumCostRecursive << endl;

   return 0;
}

输出

Minimum cost (Recursive): 15

在此代码中,我们定义了`calculateMinimumCostRecursive`函数,该函数将移动成本、按下成本、目标时间和当前数字作为参数。在函数内部,我们检查基本情况,即当前数字是否小于 0。在递归情况下,我们遍历当前数字的所有可能值,并通过考虑移动成本、按下成本以及递归调用下一个数字的函数来计算成本。我们跟踪最低成本并将其作为结果返回。

方法 2:动态规划方法

在动态规划方法中,我们将使用算法部分中提到的动态规划表。我们将遍历目标时间的数字,计算每个数字值的最低成本,并相应地更新动态规划表。最后,从我们保存在表最后一个位置的数据中返回最小的可行成本将结束我们的分析。

示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int calculateMinimumCostDynamic(vector<int> movement, vector<int> push, int targetTime) {
   int n = movement.size();
   vector<int> dp(targetTime + 1, INT_MAX);
   dp[0] = 0;

   for (int i = 0; i < n; i++) {
      for (int j = movement[i]; j <= targetTime; j++) {
         dp[j] = min(dp[j], movement[i] * (j / movement[i]) + push[i] + dp[j % movement[i]]);
      }
   }

   return dp[targetTime];
}

int main() {
   // Example usage
   vector<int> movement = {5, 4, 3, 2, 1}; // Movement cost for each digit
   vector<int> push = {1, 2, 3, 4, 5};     // Push cost for each digit
   int targetTime = 12345;                 // Target time to set

   int minimumCostDynamic = calculateMinimumCostDynamic(movement, push, targetTime);
   cout << "Minimum cost (Dynamic Programming): " << minimumCostDynamic << endl;

   return 0;
}

输出

Minimum cost (Dynamic Programming): -2147471303

在此代码中,我们定义了`calculateMinimumCostDynamic`函数,该函数将移动成本、按下成本和目标时间作为参数。我们初始化一个大小为`(targetTime + 1)`的动态规划表`dp`,并将所有值设置为一个较大的值,除了第 0 个位置,该位置设置为 0。然后,我们遍历每个数字和从移动成本到目标时间的每个时间值。对于每次迭代,我们通过考虑移动成本、按下成本以及为前一个数字获得的最低成本来计算最低成本。我们使用每个时间值的最低成本更新动态规划表。

结论

可以优化设置数字时钟计时器在给定移动和按下成本下的操作,以实现最低成本。在本文中,我们探讨了语法、算法以及两种不同的计算最低成本的方法。递归方法提供了一种直接的解决方案,而动态规划方法使用表格优化了计算时间。通过在您的代码中实现这些方法,您可以有效地设置数字时钟计时器,同时最大程度地降低相关成本。

更新于:2023 年 7 月 25 日

72 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始
广告