階段を登る最小コスト dp

説明

整数配列 Cost が与えられたとします。ここで、cost[i] は階段の i 番目の段を上るコストであり、添字は 0 から始まります。この料金を支払うと、階段を 1 段か 2 段登るかを選択できます。
添字 0 または添字 1 の段から階段を登り始めるかを選択できます。
階段の一番上に到達するまでの最小コストを計算して返してください。

データ範囲:配列の長さが 1<= n <= を満たし10^5、配列内の値が満たす 1\leqslant n\leqslant 10^4

説明を入力してください:

最初の行は、配列コストの長さを示す正の整数 n を入力します。

2 行目は、配列コストの値を表す n 個の正の整数を入力します。

出力の説明:

出力の最小コスト

例1

入力:

3

2 5 20

出力:

5

手順: 下付き文字 1 の段から開始し、5 を支払い、2 段を上って階段の一番上に到達します。合計コストは5です

例 2

入力:

10

1 100 1 1 1 90 1 1 80 1

出力:

6

例証します:

インデックス 0 のステップから開始します。

1. 1 を支払い、2 段を登り、添字 2 の段に到達します。

2. 1 を支払い、2 段を登り、添字 4 の段に到達します。

3. 1 を支払い、2 段を登り、添字 6 の段に到達します。

4. 1 を支払い、階段を登り、添字 7 の階段に到達します。

5. 1 を支払い、階段を 2 つ登り、添字 9 の階段に到達します。

6. 1を支払い、一段上がると階段の上に到達します。合計コストは6です。

 コード:

import java.util.*;
import java.util.stream.Collectors;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n=Integer.parseInt(in.nextLine());
        List<Integer> list=Arrays.stream(in.nextLine().split(""))
            .map(Integer::parseInt).collect(Collectors.toList());

        int cost;
        List<Integer> minCosts=new ArrayList<>();
        for(int i=0;i<n;i++){
            if(i<2){
                minCosts.add(0);
            }else{
                int a=list.get(i-2)+minCosts.get(i-2);
                int b=list.get(i-1)+minCosts.get(i-1);
                if(a<=b){
                    minCosts.add(a);
                }else{
                    minCosts.add(b);
                }
            }
        }
        int x=list.get(n-2)+minCosts.get(n-2);
        int y=list.get(n-1)+minCosts.get(n-1);
        if(x<=y){
            cost=x;
        }else{
            cost=y;
        }
        System.out.println(cost);
    }
}

おすすめ

転載: blog.csdn.net/qq_43780761/article/details/126899517