秘密行动
蓝桥杯
问题描述
小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
做法:
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<fstream>
#include<queue>
#include<map>
using namespace std;
int h[10001]={0};
int dp[10001][3]={0};
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i];
}
for(int i=1;i<=n;i++){
//单独处理i-2导致的 数组越界(其实就是删掉了dp[i-2])
if(i==1){
dp[i][0]=min(dp[i-1][0]+h[i],dp[i-1][1]);
dp[i][1]=dp[i][2]=dp[i-1][0]+h[i];
continue;
}
//状态转移方程本体
dp[i][0]=min(dp[i-1][0]+h[i],min(dp[i-1][1],dp[i-2][2]));
dp[i][1]=dp[i][2]=dp[i-1][0]+h[i];
}
cout<<min(dp[n][0],min(dp[n][1],dp[n][2]));
return 0;
}