我的博客頁:https://www.scriptboy.cn/202.htmlhtml
前些時間虛淵玄的鉅獻小圓着實火了一把。 在黑長直(小炎)往上爬樓去對抗魔女之夜時,她遇到了一個問題想請你幫忙。 由於魔女之夜是懸浮在半空的,因此她必需要爬樓,而那座廢墟一共有n層,並且每層高度不一樣,這形成小炎爬每層的時間也不一樣。不過固然,小炎會時間魔法,能夠瞬間飛過一層或者兩層[即不耗時]。但每次瞬移的時候她都必需要至少往上再爬一層(在這個當兒補充魔力)才能再次使用瞬移。爬每單位高度須要消耗小炎1秒時間。 消滅魔女之夜是刻不容緩的,因此小炎想找你幫她找出一種最短期方案能通往樓頂。
本題有多組數據,以文件輸入結尾結束。 每組數據第一行一個數字N(1 <= N <= 10000),表明樓層數量。 接下去N行,每行一個數字H(1 <= H <= 100),表明本層的高度。c++
對於每組數據,輸出一行,一個數字S,表明通往樓頂所需的最短期。eclipse
5
3
5
1
8
4
|
1
|
假設h[n+1]表示每層的高度,h[0]=0,f[i][0]表示在第i層不飛狀況下的時間,f[i][1]表示在第i層飛的狀況下的時間,可見有以下關係:spa
- 若是層數i=1,若是在不飛的狀況下,f[1][0] = h[1];在飛的狀況下,f[1][1] = 0;
- 若是層數i=2,若是在不飛的狀況下,f[2][0] = h[2];在飛的狀況下,f[1][1] = 0;
- 若是層數i=3,若是在不飛的狀況下,f[3][0] = min(f[2][0], f[2][1])+h[3];在飛的狀況下(能夠是飛一層到i層,也能夠是飛),f[3][1] = min(f[2][0], f[1][0]);
- 因此能夠看出,狀態轉移方程爲
f[i][0] = min(f[i-1][0], f[i-1][1])+h[i]
和f[i][1] = min(f[i-1][0], f[i-2][0])
;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <bits/stdc++.h>
using namespace std;
int f[10005][2];
int h[10005];
int main()
{
int n;
while(cin >> n)
{
for(int i = 1; i <= n; i++)
{
cin >> h[i];
}
f[1][0] = h[1];f[1][1] = 0;
f[2][0] = h[2];f[2][1] = 0;
for(int i = 3; i <= n; i++)
{
f[i][0] = min(f[i-1][0], f[i-1][1]) + h[i];
f[i][1] = min(f[i-1][0], f[i-2][0]);
}
cout << min(f[n][0], f[n][1]) << endl;
}
return 0;
}
|