其他分享
首页 > 其他分享> > 动态规划—袋鼠过河

动态规划—袋鼠过河

作者:互联网

袋鼠过河

题目描述:一只袋鼠要跳过一条河,河中间打了n个弹簧,弹簧上面的数字代表下一次最多跳过几个弹簧。问最少需要跳几次。

题目解析:弹簧连续可以用数组存储每个弹簧可以跳的距离,一共n个弹簧全部跳过去则代表到达对岸

完整代码

主函数:

#include <stdio.h>

int main(){
	int n;
	int res;
	int arr[100];
	scanf("%d",&n);
	for(i = 0;i < n; i++){
		scanf("%d",&arr[i]);
	}
	res = calcminstep(arr[n]);
	printf("%d",res);
	return 0;
}

构建一个calcminstep函数,将函数返回值作为最短跳跃次数。

int calcminstep(int * arr,int n){
	int dp[101] = {0};
	int i,j;
	for(i = 1;i <= n; i++){
		dp[i] = -1;
	}
	for(i = 0;i < n; i++){
		for(j = 1;j <= arr[j] && i + j <= n; j++)
			if(dp[i + j] == -1 || dp[i] + 1 < dp[i + j]){
				dp[i + j] = dp[i] + 1;                  
			}
	}
	return dp[n];
}

代码分析

构建dp数组与弹簧的数组arr相对应,dp数组记录跳了多少次,但dp数组要比arr数组长多一个。原因是arr数组最后一位是弹簧,并不代表已经到达岸上。

int dp[101];

dp数组元素记录已经跳了几次,所以dp[0]赋值为0。整型数组元素不赋值的情况下值不固定,所以要对所有元素进行赋值,方便循环条件的设定。

int dp[101] = {0};
	int i,j;
	for(i = 1;i <= n; i++){
		dp[i] = -1;
	}

对arr每个元素进行遍历,确定最多跳几个。用变量j代表从arr[i]开始所有可能跳的步数,即j要小于等于arr[i]的值并且从i处跳j步不能超过n个弹簧,否则就"跳远了",即数组越界。

for(i = 0;i < n; i++)
for(j = 1;j <= arr[j] && i + j <= n; j++)

运用贪心的思想,遍历到arr[i]时将每一种可能性都添加到dp数组,即对应的dp数组记录的已经跳过的步数dp[i]+1并赋值在dp[i + j]上。

但是如果dp[i + j]不是初值-1则代表在之前用贪心遍历arr[i]时已经被走过,这时就需要进行比较。如果dp[i]再跳一次比dp[i + j]处的值小,则代表dp[i] + 1是更少的跳跃次数,dp[i + j]就应该是dp[i] + 1。

for(j = 1;j <= arr[j] && i + j <= n; j++)
			if(dp[i + j] == -1 || dp[i] + 1 < dp[i + j]){
				dp[i + j] = dp[i] + 1;                  
			}

标签:arr,袋鼠,过河,int,弹簧,数组,动态,dp,赋值
来源: https://www.cnblogs.com/trey1024/p/16194321.html