题解 | #最小花费爬楼梯#

最小花费爬楼梯

http://www.nowcoder.com/practice/9b969a3ec20149e3b870b256ad40844e

DP问题五步走:

  1. dp数组的含义以及下标的含义
  2. 递推公式
  3. 如何初始化
  4. 遍历顺序
  5. 打印数组

本题对前四个问题有着非常好的示范效果。

题目分析在代码里解释的应该比较详细了,不再赘述。

吐槽一下测试用例有六次方,题目里说了到五次方。

第一篇牛客题解,溜了溜了

#include<iostream>
#include<cstring>

/*
描述
给定一个整数数组 cost  ,其中 cost[i] 是从楼梯第i 个台阶向上爬需要支付的费用,下标从0开始。
一旦你支付此费用,即可选择向上爬一个或者两个台阶。
*/
using namespace std;
const int MAXN = 100000+1;
int cost[MAXN];
int dp[MAXN];

//手写分析过程:
//从大到小分析 对于第 i 阶,到顶需要的花费   dp[i] = cost[i] + min(dp[i + 1] , dp[i + 2])
//最后取 min(dp[0] , dp[1])
int main(){
	int n;
	cin>>n;
	for (int i = 0; i < n; ++i){
		cin>>cost[i];
	}
	if(n == 1){
		cout<<cost[0]<<endl;
		return 0;
	}else if(n == 2){
		cout<<min(cost[0],cost[1]);
		return 0;
	}else{
		memset(dp,0,sizeof(dp));
		//dp初始化 对于最后一阶和倒数第二阶而言,他们需要的花费就是他们位置的cost
		dp[n - 1] = cost[n - 1];
		dp[n - 2] = cost[n - 2];
		//从单数第三个开始,花费 就是 cost[i] + min(dp[i + 1] , dp[i + 2])
		//跳一步 和 跳两步 两种情况取花费少的情况
		for (int i = n - 3; i >= 0; --i){
			dp[i] = cost[i] + min(dp[i + 1],dp[i + 2]);
		}
		//最后从“从0开始”和“从1开始” 两者选小的那个
		//实际上,二者表达的是 从0 、1开始之后的能实现的最低花费已经计算出来了
		//选择只是为了选择 “从哪个开始更优”
		cout<<min(dp[0],dp[1])<<endl;
	}
	
	return 0;
}


全部评论

相关推荐

牛客722552937号:新锐之星有点坑爹,特别是对男的
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务