算法学习009-最小花费爬楼梯 c++动态规划算法实现 中小学算法思维学习 信奥算法解析-LMLPHP

目录

C++最小花费爬楼梯

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、运行结果

五、考点分析

六、推荐资料


C++最小花费爬楼梯

一、题目要求

1、编程实现

给定一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

注:总的台阶数n在1到40之间

2、输入输出

输入描述:第一行输入台阶个数n(1<=n<=40)

                  第二行输入n个数

输出描述:只有一行,一个整数,即爬到楼顶部的最低花费

输入样例:

8
2 3 2 3 2 3 1 2

输出样例:

7

二、算法分析

  1. 从给定题目的初步分析可以看出,本题同样是爬楼梯题型
  2. 算法学习008的升级版,只是加了个费用的权值
  3. 所以可以采用动态规划的方式实现
  4. 由于要求的是最小费用,所以可以设置动态数组dp[i],i表示爬上第几个台阶;所以对应的dp[i]就是爬上第i个台阶对应的最小费用
  5. 而要爬到第i个台阶可以从第i-1个台阶,然后往上爬1步,对应花费为爬到第i-1个台阶的最小费用(dp[i-1])加上从第i-1个台阶网上爬的费用(cost[i-1])
  6. 也可以从第i-2个台阶,然后往上爬2步,对应花费为爬到第i-2个台阶的最小费用(dp[i-2])加上从第i-2个台阶网上爬的费用(cost[i-2])
  7. 所以可以得出对应的动态数组dp[i]的状态转移方为:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
  8. 而题目已经告知爬楼梯的时候可以从下标为0和下标为1的台阶开始爬,所以dp[0]=dp[1]=0

三、程序编写

//程序中的dp和cost数组可以使用动态数组vector进行实现更好
#include<bits/stdc++.h>
using namespace std;
int dp[45];
int climbCost(int cost[],int n)
{
	dp[0] = dp[1] = 0;
	for(int i=2;i<=n;i++)
		dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
	return dp[n];
}
int main()
{
	int n,cost[45];
	memset(cost,0,sizeof(cost));
	cin >> n;
	for(int i=0;i<n;i++)
		cin >> cost[i];
	cout << climbCost(cost,n);
	return 0;
}

 本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102

四、运行结果

8
2 3 2 3 2 3 1 2

7

五、考点分析

难度级别:一般,这题相对而言在于最小花费,具体主要考查如下:

  1. 分析题目,找到解题思路
  2. 充分掌握变量和数组的定义和使用
  3. 学会动态规划算法的原理和使用
  4. 学会输入流对象cin的使用,从键盘读入相应的数据
  5. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  6. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  7. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  8. 充分掌握变量定义和使用、分支语句、循环语句和动态规划算法的应用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

六、推荐资料

05-09 15:55