leetcode-746-Min Cost Climbing Stairs(動態規劃)

題目描述:

On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed).函數

Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step with index 0, or the step with index 1.spa

Example 1:code

Input: cost = [10, 15, 20] Output: 15 Explanation: Cheapest is start on cost[1], pay that cost and go to the top. 

 

Example 2:blog

Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] Output: 6 Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3]. 

 

Note:ip

  1. cost will have a length in the range [2, 1000].
  2. Every cost[i] will be an integer in the range [0, 999].

 

要完成的函數:

int minCostClimbingStairs(vector<int>& cost) it

 

說明:

一、給定一個vector,裏面存放着從各個階梯「躍起」的代價,每次躍起能夠躍起一個臺階,也能夠一次性躍起兩個臺階。好比[1,100,1,1,1,100,1,1,100,1]第一個元素1,表示從第一個階梯躍起,到達第二個臺階,或者第三個臺階,的代價都是1。要求一直攀爬樓梯,直到到達vector以外,好比上面給的例子,一共10個臺階,那就要攀爬到第11級,到達vector以外,輸出所花費的最小代價。這道題限制攀爬樓梯能夠從第一個臺階開始,也能夠從第二個臺階開始。io

 

二、上述題目是否是略微嗅到了一點動態規劃的味道,不須要找出所有可能的攀爬序列,只須要每次存儲一個狀態,而後攀爬到下一個臺階存儲另外一個狀態。class

不過這道題因爲能夠躍升一個臺階,也能夠一次性躍升兩個臺階,因此咱們須要存儲兩個值,好比一個是到達第三個臺階的最小花費,另外一個是到達第四個臺階的最小花費,接着咱們就能夠計算到達第五個臺階和第六個臺階的最小花費,一直這樣計算下去。cli

代碼以下:im


   int minCostClimbingStairs(vector<int>& cost) {
     //先計算從第一個臺階開始攀爬的狀況
int i=1,j=2,s1=cost.size();//i和j表示當前到達的臺階,i在前,j在後 int costi=cost[0],costj=cost[0],total,totalnew;
     //costi表示攀爬到i這一位須要的最小花費,costj同理
while(j!=s1-1&&j!=s1-2) { costi=min(costi+cost[i],costj+cost[j]);//計算到達i+2位的最小花費 i+=2; costj=min(costi+cost[i],costj+cost[j]);//計算到達j+2位的最小花費 j+=2; } if(j==s1-2)//若是j以後還有一個元素 { costj=costj+cost[j]; costi=costi+cost[i]+cost[i+2]; total=min(costi,costj); } else {//若是j已是最後一位 costi=costi+cost[i]; costj=costj+cost[j]; total=min(costi,costj); }
     //計算從第二個臺階開始攀爬的狀況,下述代碼同理 i
=2,j=3; costi=cost[1],costj=cost[1]; while(j!=s1-1&&j!=s1-2) { costi=min(costi+cost[i],costj+cost[j]); i+=2; costj=min(costi+cost[i],costj+cost[j]); j+=2; } if(j==s1-2) { costj=costj+cost[j]; costi=costi+cost[i]+cost[i+2]; totalnew=min(costi,costj); } else { costi=costi+cost[i]; costj=costj+cost[j]; totalnew=min(costi,costj); } return min(total,totalnew); }

上述代碼實測14ms,beats 49.37% of cpp submissions。

 

三、改進:

能夠從第一個臺階開始,也能夠從第二個臺階開始,筆者隱隱以爲這種狀況,和咱們每一步要處理的兩個最小花費,有類似的地方。

因而,咱們能夠把從第二個臺階開始的狀況,也歸入處理的範疇,一塊兒處理,這樣能夠快不少,代碼以下:(附解釋,主要修改了costj的初始值)

 int minCostClimbingStairs(vector<int>& cost) { int i=1,j=2,s1=cost.size(); int costi=0,costj=min(costi+cost[i],cost[0]),total;
     //costi表示到達i也就是第二個臺階(i從0開始)的最小花費,當前爲0
//costj表示到達j也就是第三個臺階(j從0開始)的最小花費,考慮從
     //第一個臺階開始攀爬和從第二個臺階開始攀爬的兩種狀況
while(j!=s1-1&&j!=s1-2) { costi=min(costi+cost[i],costj+cost[j]); i+=2; costj=min(costi+cost[i],costj+cost[j]); j+=2; } if(j==s1-2)//把2中未改進的代碼簡化一下 total=min(costi+cost[i]+cost[i+2],costj+cost[j]); else total=min(costi+cost[i],costj+cost[j]); return total; }

上述代碼實測12ms,beats 93.11% of cpp submissions。

相關文章
相關標籤/搜索