1. 程式人生 > >[Lintcode]跳躍遊戲 II

[Lintcode]跳躍遊戲 II

給出一個非負整數陣列,你最初定位在陣列的第一個位置。

陣列中的每個元素代表你在那個位置可以跳躍的最大長度。   

你的目標是使用最少的跳躍次數到達陣列的最後一個位置。

樣例

給出陣列A = [2,3,1,1,4],最少到達陣列最後一個位置的跳躍次數是2(從陣列下標0跳一步到陣列下標1,然後跳3步到陣列的最後一個位置,一共跳躍2次)

分析,一維DP。res[i]代表到達i處的步數。
public class Solution {
    /**
     * @param A: A list of lists of integers
     * @return: An integer
     */
    public int jump(int[] A) {
        if(A.length == 0) return 0;
        
        int[] res = new int[A.length];
        res[0] = 1;
        
        for(int i = 1; i < A.length; i++) {
            for(int j = i - 1; j >= 0; j--) {
                //(2) A[j] + j >= i成立即可,即能到j處並且加上j的步數後能到i處。之前步數可以忽略。假如之前步數足夠大可以到達i點,則總步數與從j處開始一樣。如果很大但是不足以到達i處,假設到達k處,那麼與之前的情況一致,在k處考慮A[k] + k > i是否成立即可。
                if(res[j] != 0 && A[j] + j >= i) {
                    //(1)
                    if(res[i] == 0) res[i] = res[j] + 1;
                    else res[i] = Math.min(res[j] + 1, res[i]);
                }
            }
        }
        return res[A.length - 1] - 1;
    }
}