使用 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 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告