【计蒜客系列】挑战难题20:跳跃游戏二

来源:互联网 发布:小米手机全系列 知乎 编辑:程序博客网 时间:2024/04/28 18:10

题目来源:计蒜客


给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
你的目标是到达最后一个下标,并且使用最少的跳跃次数。
例如:
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 >= iint 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个元素,所以需要增加一次跳跃次数使之达到maxScopeif(curScope < i){count++;curScope = maxScope;}if(maxScope <= nums[i] + i)maxScope = nums[i] + i;}return count;}



0 0