Cây nhị phân tìm kiếm tối ưu (C.P.VNOI 2021 LMH R10)

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1800 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Cây nhị phân tìm kiếm (Binary Search Tree - BST) trên tập \(n\) khóa số nguyên là một cây nhị phân thỏa mãn: Mỗi nút chứa đúng một khóa và khóa trong một nút lớn hơn mọi khóa trong nhánh con trái và nhỏ hơn mọi khóa trong nhánh con phải. Có nhiều cấu trúc BST để biểu diễn một tập các khóa. Như hình dưới đây là hai BST biểu diễn tập các khóa \(\{1,2,3,4,5,6\}\).

Quá trình tìm kiếm một giá trị \(x\) trên BST thực hiện như sau: Bắt đầu từ nút gốc, tại mỗi bước, \(x\) được so sánh với khóa tại nút đang đứng \((y)\):

  • Nếu \(x = y\), quá trình tìm kiếm kết thúc, kết luận \(x\) có trong BST
  • Nếu \(x < y\), đi sang nhánh con trái và quá trình tìm kiếm tiếp tục trong cây con trái bằng cách tương tự
  • Nếu \(x > y\), đi sang nhánh con phải và quá trình tìm kiếm tiếp tục trong cây con phải bằng cách tương tự
  • Nếu tại một bước nào đó, thuật toán không thể đi tiếp được theo luật trên, quá trình tìm kiếm dừng và kết luận \(x\) không có trong BST.

Chi phí một phép tìm kiếm giá trị \(x\) bằng số phép so sánh khóa được thực hiện trong thuật toán. Như ở hình trên, để tìm khóa \(3\) trong cây (a) ta cần \(3\) phép so sánh trong khi đó để tìm khóa \(3\) trong cây (b) ta chỉ cần \(2\) phép so sánh.

Yêu cầu

Cho \(n\) khóa đánh số từ \(1\) tới \(n\) theo thứ tự tăng dần của các khóa, biết rằng người ta thực hiện \(c_i\) lần phép tìm kiếm khóa \(i\) trên cấu trúc BST biểu diễn tập khóa này \((i = 1,2,...,n)\). Hãy tìm cấu trúc BST sao cho tổng chi phí các phép tìm kiếm là nhỏ nhất.

Input

  • Dòng 1 chứa số nguyên dương \(n \leq 2000\)
  • Dòng 2 chứa \(n\) số nguyên không âm \(c_1, c_2, ..., c_n\) cách nhau bởi dấu cách \((i: c_i \leq 10^9)\)

Output

  • Ghi ra file văn bản một số nguyên duy nhất là tổng chi phí (tính bằng số phép so sánh khóa được thực hiện) trên cấu trúc BST tìm được

Example

Test 1

Input
6
4 9 5 1 3 2
Output
48
Note

Cấu trúc cây (b) là tối ưu cho dữ liệu này

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.