动态规划—袋鼠过河
作者:互联网
袋鼠过河
题目描述:一只袋鼠要跳过一条河,河中间打了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