สมมติว่าเราได้รับอาร์เรย์ที่มีตัวเลขจำนวนเต็ม เราสามารถดำเนินการที่เราสามารถแทนที่ค่าของ array[i] ด้วยค่ากำลังสองของมัน หรือ array[i] * array[i] อนุญาตให้ดำเนินการประเภทนี้ได้เพียงครั้งเดียว และเราต้องส่งคืนผลรวมของอาร์เรย์ย่อยสูงสุดที่เป็นไปได้หลังการดำเนินการ ต้องระบุอาร์เรย์ย่อย
ดังนั้น หากอินพุตเป็นอาร์เรย์ =[4, 1, -2, -1] เอาต์พุตจะเป็น 17
หากเราแทนที่ค่าในอาร์เรย์[0] ด้วยค่ากำลังสอง อาร์เรย์จะกลายเป็น [16, 1, -2, -1] อาร์เรย์ย่อยสูงสุดที่เป็นไปได้จากนี้คือ [16, 1] และมีค่ารวมสูงสุด 16 + 1 =17
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- dp1 :=รายการใหม่ที่มีค่าลบอนันต์
- dp2 :=รายการใหม่ที่มีค่าลบอนันต์
- สำหรับแต่ละ num ในอาร์เรย์ ทำ
- แทรกสูงสุดของ ((องค์ประกอบสุดท้ายของ dp1 + num), num) ที่ส่วนท้ายของ dp1
- แทรกสูงสุดของ ((องค์ประกอบสุดท้ายที่สองของ dp1 + num^2), num^2, (องค์ประกอบสุดท้ายของ dp2 + num)) ที่ส่วนท้ายของ dp2
- คืนค่าองค์ประกอบสูงสุดของ dp2
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(array): dp1 = [float('-inf')] dp2 = [float('-inf')] for num in array: dp1.append(max(dp1[-1] + num, num)) dp2.append(max(dp1[-2] + num**2, num**2, dp2[-1]+num)) return max(dp2) print(solve([4, 1, -2, -1]))
อินพุต
[4, 1, -2, -1]
ผลลัพธ์
17