【計蒜客系列】挑戰難題20:跳躍遊戲二
阿新 • • 發佈:2019-02-09
給定一個非負整數陣列,假定你的初始位置為陣列第一個下標。
陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。
你的目標是到達最後一個下標,並且使用最少的跳躍次數。
例如:
A = [2,3,1,1,4], 到達最後一個下標的最少跳躍次數為2.(先跳躍1步,從下標0到1,然後跳躍3步,到達最後一個下標。一共兩次)
格式:
第一行輸入一個正整數n,接下來的一行,輸入陣列A[n]。
最後輸出最少的跳躍次數。
樣例1
輸入:
5
3 1 1 1 1
輸出:
2
動態規劃:
#include<stdio.h> #include<malloc.h> #define INT_MAX 999999 //dp[i]:到達i的最小跳躍次數 //每次迴圈儘量找到最小的dp[j],使其滿足A[j]+j >= i int jump(int A[], int n) { if(n <= 1) return 0; int *dp = (int *) malloc((n+1) * sizeof(int)); int i,j; for(i = 1;i < n;i++) dp[i] = INT_MAX; dp[0] = 0; for (i = 1; i < n; i++) { for(j = 0;j < i;j++) { if(A[j] + j >= i) { if(dp[j] + 1 < dp[i]) { dp[i] = dp[j] + 1; break; } } } } return dp[n-1]; } int main(int argc, char **argv) { int i, n; scanf("%d", &n); int *a = (int *) malloc(n * sizeof(int)); for (i = 0; i < n; i++) { scanf("%d", &a[i]); } int ans = jump(a,n); printf("%d\n",ans); }
貪心:
int jumpTX(int* nums,int numsSize) { int count = 0;//跳躍次數 int maxScope = 0;//當前0~i這i+1個nums元素中能達到的最大範圍 int curScope = 0;//從nums[0]跳躍count次之後達到的最大範圍 int i; for(i = 0;i < numsSize;i++) { //跳躍count次不足以到達第i個元素,所以需要增加一次跳躍次數使之達到maxScope if(curScope < i) { count++; curScope = maxScope; } if(maxScope <= nums[i] + i) maxScope = nums[i] + i; } return count; }