#1、描述
陣列的每個索引做為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 cost[i](索引從0開始)。
每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。
您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。
示例 1:
輸入: cost = [10, 15, 20]
輸出: 15
解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。
示例 2:
輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
輸出: 6
#2、思路
1、以為是從第0,或者從1選定開始兩次dp然後取最優,不過還是沒想通
2、找狀態!把目標鎖定在某乙個固定階梯上,只能通過前乙個或者前兩個到達。就取那個小的,登上
此階梯的花費是min(前乙個,後乙個)+此階梯的代價
3、把最後樓頂的代價當成0,
#3、notes
1、vector拷貝構造 : vectorvec ( nums.begin(),nums.end() );
#4、複雜度
2、空間:拷貝陣列時是:o ( n ) ,改進後是 o ( 1 ) 只有變數abc
#5、code
class solution {
public:
int mincostclimbingstairs(vector& cost) {
vectorcost1(cost.begin(),cost.end());
cost1.push_back(0);
int ind=cost1.size();
int a=0;
int b=0;
int c=0;
for(int i=0;ic=min(a,b)+cost1[i];
a=b;
b=c;
return b;
改進之後不用拷貝陣列時候,因為a, b 一直保持著更新,所以最後選擇a 和b 小的那個就好!
class solution {
public:
int mincostclimbingstairs(vector& cost) {
int ind=cost.size();
int a=0;
int b=0;
int c=0;
for(int i=0;ic=min(a,b)+cost[i];
a=b;
b=c;
return min(a,b);
最小代價樹
題目 描述以下方法稱為最小代價的字母樹 給定一正整數序列,例如 4,1,2,3,在不改變量的位置的條件下把它們相加,並且用括號來標記每一次加法所得到的和。例如 4 1 2 3 5 5 10。除去原數不4,1,2,3之外,其餘都為中間結果,如5,5,10,將中間結果相加,得到 5 5 10 20,那麼...
最小編輯代價
對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小...
最小編輯代價
給定兩個字串str1和str2,再給定三個整數ic,dc和rc,分別代表插入 刪除和替換乙個字元的代價,請輸出將str1編輯成str2的最小代價。輸出三行,第一行和第二行均為一行字串,分別表示兩個字串str1,str2。left 1 leq length str1 length str2 leq 5...