魔法少女【動態規劃問題】——NYOJ1204

我的博客頁:https://www.scriptboy.cn/202.htmlhtml

題目描述:

前些時間虛淵玄的鉅獻小圓着實火了一把。 在黑長直(小炎)往上爬樓去對抗魔女之夜時,她遇到了一個問題想請你幫忙。 由於魔女之夜是懸浮在半空的,因此她必需要爬樓,而那座廢墟一共有n層,並且每層高度不一樣,這形成小炎爬每層的時間也不一樣。不過固然,小炎會時間魔法,能夠瞬間飛過一層或者兩層[即不耗時]。但每次瞬移的時候她都必需要至少往上再爬一層(在這個當兒補充魔力)才能再次使用瞬移。爬每單位高度須要消耗小炎1秒時間。 消滅魔女之夜是刻不容緩的,因此小炎想找你幫她找出一種最短期方案能通往樓頂。

輸入描述:

本題有多組數據,以文件輸入結尾結束。 每組數據第一行一個數字N(1 <= N <= 10000),表明樓層數量。 接下去N行,每行一個數字H(1 <= H <= 100),表明本層的高度。c++

輸出描述:

對於每組數據,輸出一行,一個數字S,表明通往樓頂所需的最短期。eclipse

樣例輸入:

 

 

樣例輸出:

 

 

 

思路:

假設h[n+1]表示每層的高度,h[0]=0,f[i][0]表示在第i層不飛狀況下的時間,f[i][1]表示在第i層飛的狀況下的時間,可見有以下關係:spa

  1. 若是層數i=1,若是在不飛的狀況下,f[1][0] = h[1];在飛的狀況下,f[1][1] = 0;
  2. 若是層數i=2,若是在不飛的狀況下,f[2][0] = h[2];在飛的狀況下,f[1][1] = 0;
  3. 若是層數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]);
  4. 因此能夠看出,狀態轉移方程爲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])

AC代碼:

 

相關文章
相關標籤/搜索