canuc80k0746·47/50

Phủ Các Ô Được Chọn

Nộp bài trên LQDOJ

Bài 07 · Backtracking

Cho bảng nhị phân . Có năm tờ giấy vuông cho mỗi kích thước . Mỗi tờ phải nằm trọn trong bảng, chỉ phủ ô , và không chồng lên tờ khác. Hãy phủ toàn bộ ô bằng ít tờ nhất.

Input

  • Gồm dòng, mỗi dòng chứa số hoặc .

Output

  • In số tờ ít nhất; nếu không thể phủ thì in .

Constraints

  • Bảng luôn có kích thước .
  • Có tối đa tờ cho mỗi cỡ từ đến .

Scoring

  • Subtask (): Các ô chỉ nằm trong vùng góc trên trái.
  • Subtask (): Không có giới hạn bổ sung.

Example

Test 1

Input

1 1 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Output

1

Giải thích: Một tờ phủ đúng bốn ô được chọn, nên đáp án là .

Lời giải tóm tắt
  • Ý tưởng: Luôn chọn ô 1 đầu tiên theo thứ tự hàng-cột. Vì mọi ô đứng trước đã được xử lý, tờ giấy phủ ô này trong một nghiệm còn lại phải có góc trên trái chính tại ô đó.
  • Thuật toán: DFS tìm ô 1 đầu tiên, rồi thử các cỡ từ 5 xuống 1 nếu còn giấy và hình vuông tương ứng chỉ chứa 1. Đổi vùng sang 0, đệ quy và hoàn tác. Khi không còn ô 1, cập nhật số tờ nhỏ nhất.
  • Tính đúng đắn: Mọi nghiệm phải phủ ô chưa xử lý đầu tiên bằng đúng một trong các cỡ mà DFS thử. Mỗi nhánh chỉ đặt giấy trong vùng hợp lệ, không chồng lấn, và hoàn tác khôi phục trạng thái cha. Do đó DFS xét mọi cách phủ hợp lệ; lấy số tờ nhỏ nhất cho đáp án tối ưu.
  • Độ phức tạp: Cây tìm kiếm có tối đa năm lựa chọn tại mỗi ô bắt buộc; bộ nhớ đệ quy O(100).