1. 程式人生 > >貪心VS動態規劃 Jump Game 2

貪心VS動態規劃 Jump Game 2

問題:Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position. Your goal is to reach the last index in the minimum number of jumps.

For example: Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2

. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

思路:

一、首先想到動態規劃。陣列H[ ], H[i]表示index從0到i的最少跳數。若H[i] = m,那麼試圖去更新i之後的m個位置的最少跳數。

可是,需要空間複雜度O(N)。

二、貪心演算法。貪心就要每次都試圖走的更遠,意思並不是走到這一次所能走範圍的最遠,而是在這一次所能走範圍裡尋找下一次能走最遠的位置。

這樣的策略就是竭力要走的更遠。

動態規劃法:

int jump(int A[], int n) {
    if(n < 2)
        return 0;
    int H[n];
    memset(H, 0, sizeof(H));
    
    H[0] = 0;
    for(int i=0;i<n-1;i++)
    {
        int m = A[i];
        if(i + m >= n-1)
            return H[i] + 1;
        
        for(int j=1;j<=m;j++)
        {
            if(H[i+j] == 0 || H[i+j] > H[i] + 1)
                H[i+j] = H[i] + 1;
        }
    }
    return H[n-1];
}

貪心演算法:
// 貪心演算法
int jump(int A[], int n) {
    if(n < 2)
        return 0;
    int cur = 0;
    int count = 1;
    while(true)
    {
        if(cur + A[cur] >= n-1)
            return count;
        
        //在cur所能到達的範圍裡找一個能跳最遠的
        int max = cur + 1;
        for(int i=cur+2;i<=cur+A[cur]; i++)
            if(i + A[i] > max + A[max])
                max = i;
                
        cur = max;
        count++;
    }
}