DEV Community

Dinh Truong Phan
Dinh Truong Phan

Posted on • Edited on

[LDC 19.08.2024] 650. 2 Keys Keyboard - Tối Ưu Tạo ra n Ký Tự 'A'

Cách Tối Ưu Để Tạo ra n Ký Tự 'A' trên Leetcode – Đừng Để Bài Toán Này Làm Khó Bạn!

Bạn có từng gặp bài toán nào mà chỉ có một ký tự 'A' trên màn hình, và nhiệm vụ của bạn là tạo ra nhiều ký tự 'A' nhất có thể? Nghe có vẻ dễ, nhưng bạn sẽ ngạc nhiên với độ phức tạp ẩn chứa bên trong! Hôm nay, chúng ta sẽ cùng nhau giải mã bài toán này một cách dễ hiểu và tối ưu nhất.

Bài Toán - Bắt Đầu Từ Số 0

Bài toán yêu cầu bạn tìm ra số bước tối thiểu để tạo ra n ký tự 'A' từ một ký tự 'A' ban đầu trên màn hình. Bạn chỉ có hai thao tác: Copy All và Paste. Nhưng liệu bạn có thể tìm ra cách tối ưu để đạt được n ký tự chỉ trong vài bước?

Phân Tích - Tìm Kiếm Chiến Lược

Trước khi chúng ta lao vào code, hãy thử nghĩ về bài toán này. Nếu bạn muốn có n ký tự 'A', bạn phải bắt đầu từ con số nào? Dĩ nhiên là từ 1. Vậy sau đó thì sao? Bạn cần copy tất cả ký tự hiện có, rồi paste chúng nhiều lần. Nhưng làm thế nào để biết khi nào cần copy, khi nào cần paste?

Dynamic Programming - Cứu Tinh Của Những Bài Toán Phức Tạp

Đây chính là nơi mà Dynamic Programming (Quy hoạch động) tỏa sáng. Thay vì xử lý trực tiếp từng bước, chúng ta sẽ xây dựng một bảng (mảng dp) lưu trữ số bước tối thiểu để đạt được từng số lượng ký tự 'A' từ 1 đến n.

Ví dụ cụ thể:

Bạn có 1 ký tự 'A' (dp[1] = 0).
Bạn muốn có 2 ký tự? Bạn cần copy và paste (2 bước).
Nhưng nếu bạn muốn có 4 ký tự? Đầu tiên, copy tất cả (1 bước), sau đó paste 3 lần (3 bước). Tổng cộng là 4 bước.

Code - Đưa Chiến Lược Thành Hành Động

class Solution:
    def minSteps(self, n: int) -> int:
        dp = [1000 for _ in range(n+1)]  # Khởi tạo giá trị lớn cho dp
        dp[1] = 0  # Chỉ cần 0 bước để có 1 ký tự 'A'

        for i in range(2, n+1):
            for j in range(1, i//2+1):
                if i % j == 0:  # Kiểm tra nếu i chia hết cho j
                    dp[i] = min(dp[i], dp[j] + i//j)  # Cập nhật số bước tối thiểu

        return dp[n]
Enter fullscreen mode Exit fullscreen mode

Giải Thích - Không Chỉ Là Code

Trong đoạn code trên, chúng ta sử dụng mảng dp để lưu trữ số bước tối thiểu cần thiết. Với mỗi số lượng ký tự từ 2 đến n, chúng ta kiểm tra xem liệu nó có thể được tạo ra từ một số lượng ký tự nhỏ hơn bằng cách nhân (copy + paste). Nếu có, chúng ta cập nhật số bước tối thiểu cho dp[i].

Kết Quả - Bài Toán Trở Nên Dễ Dàng Hơn

Bằng cách áp dụng quy hoạch động, chúng ta đã biến một bài toán tưởng chừng phức tạp trở nên dễ dàng hơn nhiều. Bây giờ bạn không cần phải lo lắng về việc tìm cách tạo ra n ký tự 'A' trong thời gian tối thiểu nữa!

Lời Khuyên Cuối Cùng

Hãy thử áp dụng chiến lược này cho các bài toán khác trên Leetcode và ghi chú lại những gì bạn đã học được. Việc này không chỉ giúp bạn ghi nhớ sâu hơn mà còn tạo cơ hội để bạn tự tin hơn khi đối mặt với các bài toán khó.

Đừng quên! Mỗi khi bạn gặp một bài toán khó, hãy thử phân tích nó một cách cẩn thận và tìm ra chiến lược giải quyết trước khi viết code. Đó chính là cách mà các developer hàng đầu chinh phục Leetcode!

Top comments (0)