試題 算法提高 祕密行動
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
小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
import java.util.Scanner;
public class 祕密行動 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int [] num = new int [n];
for (int i=0;i<n;i++){
num[i]=sc.nextInt();
}
sc.close();
int [] []dp = new int [n+1][2];
//第一個爬上來的是第一層的長度
dp[1][0]=num[0];
//跳上來的長度爲0
for (int i=2;i<=n;i++){
//dp[i][0]就是爬上來的所以要加長度,跳完爬或者爬完繼續爬
dp[i][0]=Math.min(dp[i-1][0],dp[i-1][1])+num[i-1];
//dp[i][1]是跳上來得到,他只能在爬上來的裏面選
dp[i][1]=Math.min(dp[i-1][0],dp[i-2][0]);
}
System.out.println(Math.min(dp[n][0],dp[n][1]));
}
}