思路:动态规划

1.当前在的i位置,不需要花费,只有向上走的时候才会花钱

2.真正的楼顶,是所有台阶的下一个位置。

3.要么从0位置开始,要么从1位置开始。可以走一步,也可以走两步。

  • 状态表示:dp[i] 表示:到达i位置的最小化费。

  • 转态转移方程:

    情况1:先到达i-1位置的最小花费dp[i-1],加上i-1位置需要的花费,就i位置的花费

    情况2:或者先到达 i-2的位置的最小花费dp[i-2],加上i-2位置需要的花费,就是i位置的花费

    取两种情况的最小值

  • dp[i] = min( dp[i-1]+cost[i-1] ,dp[i-2]+cost[i-2] )

  • 填表顺序:从左往右

  • 初始化:dp[0] = 0 , dp[1] = 0

  • 最终返回dp[n],因为楼顶在最后一个数组位置[n-1]的下一个位置。

代码:
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[]cost = new int[n];
        int[]dp = new int[n+1];
        for(int i = 0;i<n;i++){
            cost[i] = in.nextInt();
        }
        for(int i = 2;i<=n;i++){
            dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        System.out.println(dp[n]);
    }