### [746. Min Cost Climbing Stairs](https://leetcode.com/problems/min-cost-climbing-stairs/?envType=daily-question&envId=2023-10-13) # 1. Tóm tắt đề bài Cho một mảng `cost` với `cost[i]` chính là giá phải trả khi bước vào nấc thang thứ `i` trên một chiếc cầu thang. Sau khi trả giá cho nấc thang thứ `i`, bạn có thể lựa chọn tiến $1$ hoặc $2$ bước. Bạn có thể bắt đầu từ nấc thang $0$ hoặc $1$ và trả tiền cho nấc đó. Hãy tính tổng giá trị nhỏ nhất sau khi đi hết nấc thang cuối. ##### Giới hạn - $2 \le cost.length \le 1000$. - $0 \le cost[i] \le 999$. # 2. Tóm tắt lời giải **Độ phức tạp dự tính: $O(n)$** Đây là một bài $dp$ căn bản, khi mà kết quả khi tính đến bậc thang thứ $i$ ($i \ge 2$) sẽ được tính dựa vào kết quả $i - 1$ và $i - 2$. Vì vậy, bài này sẽ có chút hình hài của Fibonacci. # 3. Lời giải chi tiết Ta định nghĩa $f(i)$ là giá trị nhỏ nhất phải trả khi đi đến nấc thang thứ $i$. Công thức tính như sau: - $f(0) = cost[0]$. - $f(1) = cost[1]$. - $f(i) = cost[i] + max(f[i - 1], f[i - 2]) \forall i: 1 < i < n$. Kết quả chính là $max(f[n - 1], f[n - 2])$. Như trong code mẫu của mình, mình đã gán giá trị trên vào chính $f[n]$. ### Độ phức tạp thuật toán Thời gian: $O(n)$. Bộ nhớ mở rộng: $O(n)$. ### [Code mẫu](https://leetcode.com/problems/min-cost-climbing-stairs/submissions/1073954648/?envType=daily-question&envId=2023-10-13) # 4. Kết luận & Gợi ý mở rộng Các bạn có thể tham khảo các bài QHĐ rất dễ ở dưới đây: [509. Fibonacci Number](https://leetcode.com/problems/fibonacci-number/) [118. Pascal's Triangle](https://leetcode.com/problems/pascals-triangle/) [1025. Divisor Game](https://leetcode.com/problems/divisor-game/) Hoặc xem chuyên đề #0 của mình.