Giả sử chúng ta có một chuỗi s và một mảng số nguyên khác được gọi là cost trong đó cost [i] đại diện cho chi phí xóa ký tự thứ i trong s. Chúng ta phải tìm chi phí xóa tối thiểu sao cho không có hai chữ cái giống nhau bên cạnh nhau. Chúng tôi phải ghi nhớ rằng chúng tôi sẽ xóa các ký tự đã chọn cùng một lúc. Vì vậy, sau khi xóa một ký tự, chi phí xóa các ký tự khác sẽ không thay đổi.
Vì vậy, nếu đầu vào là s ="pptpp", cost =[2,3,4,5,2], thì đầu ra sẽ là 4 vì nếu chúng ta loại bỏ p đầu tiên và cuối cùng với chi phí 2 + 2 =4, thì chuỗi sẽ là "ptp" ở đây không có hai ký tự giống nhau nào xuất hiện lần lượt
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau−
- cost_f:=0
- i:=1
- ind:=0
- đối với tôi trong phạm vi từ 1 đến kích thước của s-1, hãy thực hiện
- cur:=s [i], c_cost:=cost [i]
- before:=s [i-1], p_cost:=cost [i-1]
- nếu ind giống 1, thì
- prev:=pres_i, p_cost:=cost_i
- nếu cur giống như trước, thì
- if c_cost> =p_cost, then
- cost_f:=cost_f + p_cost
- pres_i:=0, cost_i:=0
- ind:=0
- nếu c_cost
- cost_f:=cost_f + c_cost
- ind:=1
- pres_i:=trước, cost_i:=p_cost
- if c_cost> =p_cost, then
- nếu không,
- pres_i:=0, cost_i:=0
- ind:=0
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn:
def solve(s, cost): cost_f = 0 i = 1 ind = 0 for i in range(1, len(s)): cur, c_cost = s[i], cost[i] prev, p_cost = s[i-1], cost[i-1] if ind == 1: prev, p_cost = prev_i, cost_i if cur == prev: if c_cost >= p_cost: cost_f += p_cost prev_i, cost_i = 0,0 ind = 0 if c_cost < p_cost: cost_f += c_cost ind = 1 prev_i, cost_i = prev, p_cost else: prev_i, cost_i = 0,0 ind = 0 return cost_f s = "pptpp" cost = [2,3,4,5,2] print(solve(s, cost))
Đầu vào
"pptpp", [2,3,4,5,2]
Đầu ra
4