package leecode;

/**
* 746. 使用最小花费爬楼梯
*
* 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
*
* 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
*
* 请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
*
*
* @author Tang
* @date 2021/9/15
*/
public class MinCostClimbingStairs {


/**
* 动态规划
* n :到某个台阶n
* f(n) :到某个台阶n所需最小体力
* f(n) = min(f(n-1) , f(n-2))
* base: f(1) f(2)
*
*
*
* @param cost
* @return
*/
public int minCostClimbingStairs(int[] cost) {
// 代表f(n-1)
int n1 = 0;
// 代表f(n-2)
int n2 = 0;

int minCost = 0;
for(int i = 0; i <= cost.length; i++) {
if(i == 0) {
minCost = cost[0];
n2 = cost[0];
continue;
}

if(i == 1) {
minCost = cost[1];
n1 = cost[1];
continue;
}

if(i == cost.length) {
minCost = Math.min(n1, n2);
break;
}
minCost = Math.min(n1, n2) + cost[i];
n2 = n1;
n1 = minCost;
}

return minCost;
}

public static void main(String[] args) {
int[] cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
new MinCostClimbingStairs().minCostClimbingStairs(cost);

}

}