Một phân vùng vectơ đang phân tách một vectơ lên một loạt các vectơ sao cho tổng của chúng là bản gốc. Dưới đây là một vài phân vùng:
[3, 1, 2] = [3, 1, 2]
[3, 1, 2] = [0, 0, 1] + [0, 0, 1] + [0, 1, 0] + [1, 0, 0] + [2, 0, 0]
[3, 1, 2] = [1, 1, 2] + [2, 0, 0]
Ở đây bổ sung vector được thực hiện phần tử khôn ngoan. Phân vùng hợp lệ không chứa bất kỳ vectơ nào có số nguyên âm hoặc vectơ hoàn toàn bằng không.
Bây giờ thách thức là viết một chương trình hoặc hàm tạo ra tất cả các phân vùng vectơ có thể có cho một vectơ đích. Điều này nghe có vẻ tương đối dễ dàng ...
... nhưng có một thay đổi. Nếu vectơ đầu vào có kích thước L và phân vùng lớn nhất mà nó tạo ra có các phần tử M, bạn không được sử dụng nhiều hơn bộ nhớ O (L * M).
Bạn có thể giả sử rằng một số nguyên sử dụng bộ nhớ O (1). Điều này có nghĩa là bạn phải xuất các phân vùng khi bạn tạo chúng.Trên hết, bạn chỉ phải xuất mỗi phân vùng chính xác một lần. Ví dụ: đây là cùng một phân vùng:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Nếu bạn đã xuất cả câu trả lời của bạn là không hợp lệ.
Tất cả các phân vùng cho [3, 2]
:
[3, 2]
[0, 1] + [3, 1]
[0, 1] + [0, 1] + [3, 0]
[0, 1] + [0, 1] + [1, 0] + [2, 0]
[0, 1] + [0, 1] + [1, 0] + [1, 0] + [1, 0]
[0, 1] + [1, 0] + [2, 1]
[0, 1] + [1, 0] + [1, 0] + [1, 1]
[0, 1] + [1, 1] + [2, 0]
[0, 2] + [3, 0]
[0, 2] + [1, 0] + [2, 0]
[0, 2] + [1, 0] + [1, 0] + [1, 0]
[1, 0] + [2, 2]
[1, 0] + [1, 0] + [1, 2]
[1, 0] + [1, 1] + [1, 1]
[1, 1] + [2, 1]
[1, 2] + [2, 0]
Để kiểm tra câu trả lời của bạn, hãy chạy nó trên [3, 2, 5, 2]
. Nó sẽ tạo ra 17939 phân vùng, tất cả đều tổng hợp [3, 2, 5, 2]
và tất cả đều là duy nhất (bạn có thể kiểm tra tính duy nhất bằng cách sắp xếp trước tiên từng phân vùng theo từ vựng).
Mã ngắn nhất trong byte thắng.