跳躍遊戲
給出乙個非負整數陣列,你最初定位在陣列的第乙個位置,陣列中的每個元素代表你在那個位置可以跳躍的最大長度,判斷你是否能到達陣列的最後乙個位置。
注意事項:
陣列a的長度不超過5000,每個元素的大小不超過5000
樣例 1:
輸入:[2,3,1,1,4]
輸出:true
樣例 2:
輸入:[3,2,1,0,4]
輸出:false
解答:
定義dp[i][j]為陣列長度為i時,以第j個位置為最後乙個跳點時是否能到達最後乙個位置。
則有狀態轉換方程:
dp[i][j] = dp[j][j] && (j+a[j] >= i)
當i==j時,dp[i][j] = dp[i][0] || dp[i][1] || … || dp[i][j-1]
class
solution
/* if(a.size() > 1 && a[0] == 0)
// 貪心策略下取當前點n往後跳的範圍內能使下一次跳躍的範圍最大的那個點
// 即 n + a[k] + k 最大
int next = -1;
int max = 0;
for (int i = 0; i < a.size();)
}if(next >= a.size() - 1)
if(next != -1 && a[next] == 0)
i = next;
next = -1;
max = 0;
}return true;*/
/* 定義dp[i][j]為陣列長度為i時,以第j個位置為最後乙個跳點時是否能到達最後乙個位置。
則有狀態轉換方程:
dp[i][j] = dp[j][j] && (j+a[j] >= i)
當i==j時,dp[i][j] = dp[i][0] || dp[i][1] || ... || dp[i][j-1]
*/const
int m =
5001
;const
int n =
5001
;bool dp[m]
[n];
for(
int i =
0; i < m; i++)}
dp[0]
[0]=
true
; dp[1]
[1]=
true
;for
(int i =
1; i <= a.
size()
; i++)}
return dp[a.
size()
][a.
size()
];}}
;
遞迴與動態規劃 跳躍遊戲
題目 給定陣列arr,arr i k代表可以從位置i向右跳1 k個距離。比如,arr 2 3,代表從位置2可以跳到位置3 位置4或者位置5。如果從位置0出發,返回最少跳幾次能跳到arr最後的位置上。舉例 arr 3,2,3,1,1,4 arr 0 3,選擇跳到位置2 arr 2 3,可以跳到最後的位...
跳躍遊戲一(動態規劃)
給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。請確認你是否能夠跳躍到陣列的最後乙個下標。例如 a 2,3,1,1,4 a 2,3 1,1 4 能夠跳躍到最後乙個下標,輸出true a 3,2,1,0,4 a 3,2 1,0 4 不能跳躍到...
跳躍遊戲(貪心和動態規劃)
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...