Cho chuỗi str độ dài n. Có hai phép toán xây dựng:
- Thêm một ký tự vào cuối chuỗi với chi phí
a - Thêm một chuỗi con
sub_strvào cuối chuỗi với chi phír
Tìm chi phí tối thiểu để xây dựng chuỗi str.
Ví dụ: a = 5, r = 4, str = 'tpoint' → kết quả 29.
Chi tiết: xây dựng lần lượt 't', 'tp', 'tpo', 'tpoi', 'tpoin' (mỗi bước +1 ký tự, chi phí 5), cuối cùng thêm chuỗi con 't' (chi phí 4). Tổng = 5×5 + 4 = 29.
Thuật toán giải quyết (Dynamic Programming + Z-function)
- Tính mảng
largest[i]= độ dài lớn nhất của chuỗi con bắt đầu tạiixuất hiện trước đó trong chuỗi (dùng Z-algorithm) - DP:
c[0] = a, vớii = 1..n-1:- Nếu
largest[i] == 0:c[i] = c[i-1] + a(chỉ có thể thêm ký tự) - Ngược lại:
c[i] = min(c[i-1] + a, c[i - largest[i]] + r)(chọn min giữa thêm ký tự vs thêm chuỗi con)
- Nếu
- Trả về
c[n-1]
Ví dụ minh họa
def solve(a, r, str):
size = len(str)
largest = []
low = 0
for upp in range(1, size+1):
while str[low:upp] not in str[:low]:
low += 1
largest.append(upp - low)
c = [a]
for i in range(1, size):
if largest[i] == 0:
c.append(c[-1] + a)
else:
c.append(min(c[-1] + a, c[i - largest[i]] + r))
return c[-1]
print(solve(5, 4, 'tpoint'))
Đầu vào
5, 4, 'tpoint'
Đầu ra
29