蓝桥杯-算法提高-秘密行动-DP

蓝桥杯-算法提高-秘密行动-DP

  • 问题描述
      小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用。已知向上1高度消耗的时间为1,跳跃不消耗时间。由于事态紧急,小D想知道他最少需要多少时间到达顶层。
  • 输入格式
      第一行包含一个整数n,代表楼的高度。
      接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。
  • 输出格式
      输出1行,包含一个整数,表示所需的最短时间。
  • 样例输入
    5
    3
    5
    1
    8
    4
  • 样例输出
    1
  • 数据规模和约定
      对20%的数据,n<=10
      对40%的数据,n<=100
      对60%的数据,n<=5000
      对100%的数据,n<=10000
  • 解题思路:

到达第i层有两种方式:

dp[i][0]=h[i];//爬到第i层 
dp[i][1]=0;//跳跃到第i层

所以,到达第i层的时间计算有两个状态转移方程:
1.爬到第i层时,达到第i-1层有两种方式,即:爬到第i-1层,跳跃到第i-1层;

dp[i][0]=min(dp[i-1][0],dp[i-1][1])+h[i];

2.跳跃到第i层时,有两种方式跳跃到第i层,从第i-1层跳跃或者从第i-2层跳跃,那么,达到第i-1层或第i-2层只能是爬上去的;

dp[i][1]=min(dp[i-1][0],dp[i-2][0]);

最后,计算两种状态哪个所需时间最少。

min(dp[n][0],dp[n][1])
  • AC代码:
#include<iostream>
using namespace std;
int n;//楼高度
int h[10002];//楼层高度
int dp[10002][2]={0};//到达顶层的时间 
int time;//最少需要的时间 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>h[i];
	} 
	dp[1][0]=h[1];//爬到第一层 
	dp[1][1]=0;//跳到第一层 
	for(int i=2;i<=n;i++){
		dp[i][0]=min(dp[i-1][0],dp[i-1][1])+h[i];
		dp[i][1]=min(dp[i-1][0],dp[i-2][0]);
	} 
	int time=min(dp[n][0],dp[n][1]);
	cout<<time<<endl;
	return 0;
} 

在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页