สมมติว่ามีลำดับ X_1, X_2, ..., X_n เรียกว่าฟิบอนาชชี-ลักษณะ (fibonacci-like) หาก:
n >= 3X_i + X_{i+1} = X_{i+2}สำหรับทุกi + 2 <= n
ถ้ามีอาร์เรย์ A ที่เพิ่มขึ้นอย่างเคร่งครัด เราต้องหาความยาวของส่วนต่อเนื่อง (subsequence) แบบฟิบอนาชชีที่ยาวที่สุดของ A หากไม่มี ให้คืนค่า 0
ตัวอย่าง: A = [1,2,3,4,5,6,7,8] ผลลัพธ์คือ 5 เพราะมีลำดับ [1,2,3,5,8] ความยาว 5
วิธีแก้ปัญหา
sA := เซตจากองค์ประกอบของ Alast := องค์ประกอบสุดท้ายของ AB := แมปเก็บความถี่ของแต่ละค่าใน Abest := 0- วนลูป
iจากขนาดของAลงมา0:a := A[i]- วนลูป
bในสับอาร์เรย์A[i+1:]:c := a + b- ถ้า
cอยู่ในsA:B[a,b] := 1 + B[b,c]best := max(best, B[a,b] + 2)
- มิฉะนั้นถ้า
c > lastให้ออกจากลูป
- คืนค่า
best
ตัวอย่างโค้ด
from collections import Counter
def solve(A):
sA = set(A)
last = A[-1]
B = Counter()
best = 0
for i in reversed(range(len(A))):
a = A[i]
for b in A[i+1:]:
c = a + b
if c in sA:
B[a,b] = 1 + B[b,c]
best = max(best, B[a,b] + 2)
elif c > last:
break
return best
A = [1,2,3,4,5,6,7,8]
print(solve(A))
อินพุต
[1,2,3,4,5,6,7,8]
เอาต์พุต
5