1. 程式人生 > >【計蒜客系列】挑戰難題20:跳躍遊戲二

【計蒜客系列】挑戰難題20:跳躍遊戲二

給定一個非負整數陣列,假定你的初始位置為陣列第一個下標。
陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。
你的目標是到達最後一個下標,並且使用最少的跳躍次數。
例如:
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;
}