bài tập lập trình động về cắt dây


16

Tôi đã làm việc về vấn đề sau từ cuốn sách này .

Một ngôn ngữ xử lý chuỗi nhất định cung cấp một hoạt động nguyên thủy chia tách một chuỗi thành hai phần. Vì thao tác này liên quan đến việc sao chép chuỗi gốc, nên cần n đơn vị thời gian cho một chuỗi có độ dài n, bất kể vị trí của vết cắt. Giả sử, bây giờ, bạn muốn chia một chuỗi thành nhiều phần. Thứ tự nghỉ được thực hiện có thể ảnh hưởng đến tổng thời gian chạy. Ví dụ: nếu bạn muốn cắt chuỗi 20 ký tự ở vị trí 3 và , thì lần cắt đầu tiên ở vị trí phải chịu tổng chi phí là , trong khi thực hiện vị trí 10 trước có chi phí tốt hơn là .10320+17=3720+10=30

Tôi cần một thuật toán lập trình động cho phép cắt , tìm ra chi phí tối thiểu để cắt một chuỗi thành .mm+1

Câu trả lời:


10

Ý tưởng cơ bản là: Hãy thử tất cả các vị trí cắt làm lựa chọn đầu tiên, giải quyết các phần tương ứng theo cách đệ quy, thêm chi phí và chọn mức tối thiểu.

Trong công thức:

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], else

Lưu ý rằng việc áp dụng phân biệt cho đệ quy này thực sự tiết kiệm công việc khi chuyển đổi thứ tự của bất kỳ cặp cắt giảm được áp dụng liên tiếp nào trong ba bài toán con giống nhau được giải quyết.


1

Luôn luôn là một ý tưởng tốt để tìm một thuật toán đệ quy trước và sau đó biến nó thành một bảng.

  1. f(C,n)
  2.   if (C = ) trả về 0;
  3.   khác
  4.     opt = vô cùng;
  5.     cho mỗi làmcC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.     trả về ;opt+n

Vì vậy, bạn có thể hỏi: không có quá nhiều tập con của C được đặt trong một bảng? Quan sát rằng chỉ cần các tập con 'liên tiếp'. Và chỉ có trong số họ (tại sao) Một vấn đề khác là:.? Một số mục sẽ thay đổi giá trị trongE. Chúng ta có thể đi bộ xung quanh điều này bằng cách chỉ ra bắt đầu và kết thúc trong mỗifthay vì chỉ xác định độ dài.(n2)Ef


0

Điều này rất giống với Quicksort trên multiset; nó tối ưu khi điểm cắt gần giữa, và sau đó chúng tôi lặp lại.

Nếu tôi đưa cho bạn một phiên bản được xáo trộn của multiset M = {1,1,1..1,2,2 ... 2, ...., m, m..m} trong đó các lần chạy kết thúc tại mỗi điểm cắt , bạn sẽ tối ưu quicksort nó bằng cách chọn một vết cắt gần giữa là trục. Hoạt động phân tách các phần tử thành các phân vùng bên trái và bên phải có n hoạt động giống như cách phân tách chuỗi, do đó bạn có thể sử dụng các đối số tương tự như Quicksort để chỉ ra rằng trung vị là tối ưu. sk

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.