C++动态规划解决数组跳跃问题:最少跳跃次数

本文将介绍如何使用C++结合动态规划算法解决一道经典的数组跳跃问题:计算从数组起始位置到达末尾所需的最少跳跃次数。

题目描述

给定一个数组arr,数组中的元素为非负整数。你可以从数组的任意一个位置开始跳跃,每次跳跃可以向前跳跃任意步数(小于等于当前位置的元素值),但是要保证跳跃过程中数组中的元素不为0。计算从数组起始位置到达数组末尾的最少跳跃次数。

例如:

对于数组 [2, 3, 1, 1, 4, 2, 1],最少跳跃次数为3,跳跃步骤为:

  1. 从索引0跳跃2步到索引2 (2 -> 1)
  2. 从索引2跳跃1步到索引3 (1 -> 1)
  3. 从索引3跳跃4步到索引7 (1 -> 1)

C++代码实现

以下是使用动态规划的C++代码实现:

#include <iostream>
#include <vector>
#include <limits>
using namespace std;

int jump(vector<int>& arr) {
    int n = arr.size();
    
    // 创建一个dp数组,dp[i]表示达到第i个位置的最少跳跃次数
    vector<int> dp(n, numeric_limits<int>::max());
    dp[0] = 0; // 起始位置的最少跳跃次数为0
    
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            // 如果从j位置能够跳跃到i位置,并且跳跃次数更少,则更新dp[i]
            if (j + arr[j] >= i && dp[j] != numeric_limits<int>::max()) {
                dp[i] = min(dp[i], dp[j] + 1);
            }
        }
    }
    
    return dp[n-1];
}

int main() {
    int n;
    cin >> n;
    
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    
    int result = jump(arr);
    cout << result << endl;
    
    return 0;
}

代码解析

  1. 动态规划状态定义: dp[i] 表示到达数组中第 i 个位置所需的最少跳跃次数。
  2. 状态转移方程: 对于每一个位置 i,我们遍历它之前的所有位置 j,如果从位置 j 可以跳到位置 i (即 j + arr[j] >= i),则比较从 j 跳到 i 和之前跳到 i 的步数,取最小值更新 dp[i]
  3. 初始状态: dp[0] = 0,因为我们从数组的起始位置开始跳跃,所以到达起始位置不需要跳跃。
  4. 最终结果: dp[n-1] 即为到达数组末尾所需的最少跳跃次数。

总结

本文介绍了如何使用C++和动态规划算法解决数组跳跃问题。通过定义合适的状态和状态转移方程,我们可以高效地计算出从数组起始位置到达末尾所需的最少跳跃次数。希望本文能帮助你理解动态规划的思想并将其应用于解决实际问题。

C++动态规划解决数组跳跃问题:最少跳跃次数

原文地址: https://www.cveoy.top/t/topic/UeJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录