Cho danh sách số nums, tìm độ dài dãy con số học (arithmetic subsequence) dài nhất. Dãy số học là dãy mà hiệu giữa hai phần tử liên tiếp luôn bằng nhau.
Ví dụ: nums = [1, 4, 7, 10, 13, 20, 16] → dãy con [1, 4, 7, 10, 13, 16] có hiệu 3, độ dài 6.
Giải thuật (DP với từ điển hiệu)
dp[(i, diff)]= độ dài dãy con số học kết thúc tại chỉ sốivới công saidiff.- Khởi tạo
dpmặc định giá trị 1 (mỗi phần tử tự là dãy độ dài 1). - Duyệt
itừ 1 đếnn-1,jtừ 0 đếni-1:diff = arr[i] - arr[j].dp[(i, diff)] = dp[(j, diff)] + 1.- Cập nhật kết quả max.
Mã nguồn Python
from collections import defaultdict
class Solution:
def solve(self, arr):
n = len(arr)
if n <= 1:
return n
res = 0
dp = defaultdict(lambda: 1)
for i in range(1, n):
for j in range(i):
diff = arr[i] - arr[j]
dp[i, diff] = dp[j, diff] + 1
res = max(res, dp[i, diff])
return res
ob = Solution()
nums = [1, 4, 7, 10, 13, 20, 16]
print(ob.solve(nums)) # Output: 6
Đầu vào
[1, 4, 7, 10, 13, 20, 16]
Đầu ra
6