สมมติว่าเรามีรายการหมายเลขที่เรียกว่า nums ตอนนี้ ให้เราพิจารณาการดำเนินการที่เรานำค่าสองค่าที่ต่อเนื่องกันมารวมกันเป็นค่าเดียวโดยการหาผลรวม เราต้องหาจำนวนขั้นต่ำของการดำเนินการที่จำเป็นเพื่อให้รายการไม่เพิ่มขึ้น
ดังนั้นหากอินพุตเป็นเหมือน nums =[2, 6, 4, 10, 2] ผลลัพธ์จะเป็น 2 เนื่องจากเราสามารถรวม [2, 6] เข้าด้วยกันเพื่อรับ [8, 4, 10, 2] แล้ว ผสาน [8, 4] เพื่อรับ [12, 10, 2]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้าตัวเลขว่างก็
-
คืนค่า 0
-
-
ใส่ −inf ต่อท้าย nums
-
N :=ขนาดของ nums
-
dp :=รายการขนาด N และเติมด้วย 0
-
arr :=รายการขนาด N และเติมด้วย 0
-
p :=ขนาดของ arr
-
arr[p−1] :=nums[N−1]
-
arr[p−2] :=nums[N−2]
-
สำหรับฉันในช่วง N - 3 ถึง 0 ลดลง 1 ทำ
-
เจ :=ฉัน
-
x :=nums[j]
-
ในขณะที่ j
-
เจ :=เจ + 1
-
x :=x + nums[j]
-
-
dp[i] :=j − i + dp[j + 1]
-
arr[i] :=x
-
-
กลับ dp[0]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, nums): if not nums: return 0 nums.append(float("−inf")) N = len(nums) dp = [0] * N arr = [0] * N arr[−1] = nums[−1] arr[−2] = nums[−2] for i in range(N − 3, −1, −1): j = i x = nums[j] while j < N − 1 and x < arr[j + 1]: j += 1 x += nums[j] dp[i] = j − i + dp[j + 1] arr[i] = x return dp[0] ob = Solution() nums = [2, 6, 4, 10, 2] print(ob.solve(nums))
อินพุต
[2, 6, 4, 10, 2]
ผลลัพธ์
2