小Q爬塔

1.问题描述:

  小Q正在攀爬一座宝塔,这座宝塔很特别,塔总共有n层,但是两层之间的净高却不相同,所以造成小Q爬过每层的时间也不同。
  如果某一次高度为x,那么爬过这一层所需时间也就是x。小Q还会使用一种魔法,每使用一次可以让他向上跳1层或者两层,但是每次调后, 必须至少爬一层才能接着使用魔法。小Q想用最短的时间上顶,希望你能告诉他。
  n表示高度(n<=10000)
  x表示层差(1<=x<=100)

2.问题分析:
  • p[i]表示到达第i层最短时间,并且到达第i层方式是爬
  • t[i]表示到达第i层最短时间,并且到达第i层方式是跳
  • 情况一:到达第i层的方式是爬
  • 那么到达第i-1层的方式可以是跳,也可以是爬,二者选一
  • p[i] = Math.min(p[i-1],t[i-1])+x;
  • 情况二:到达第i层的方式是跳
  • 那么可以从第i-1层起跳,也可以从i-2层起跳,并且到达i-1层和i-2层的方式只能是爬,所以二者选最小的
  • t[i] = Math.min(p[i-1],p[i-2]);
3.图示

在这里插入图片描述

4.代码
#include<bits/stdc++.h>

using namespace std;
/*
小Q爬塔
*/
int p[10005], t[10005];
int main()
{
	int n, x;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		cin >> x;
		p[i] = min(p[i-1], t[i-1])+x;    //到达第i层的方式是爬
		if (i == 1)
		{
			continue;
		}
		t[i] = min(p[i-1], p[i-2]);    //到达第i层的方式是跳
	}

	cout << min(p[n], t[n])<< endl;
	return 0;
}
5.运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值