Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาจำนวนชุดของส่วนของเส้นตรง k-non-overlapping ใน Python


สมมติว่าเรามี n จุดบนเส้น โดยที่จุด ith (จาก 0 ถึง n-1) อยู่ที่ตำแหน่ง x =i เราต้องหาจำนวนวิธีที่เราสามารถวาด k ส่วนต่าง ๆ ของเส้นที่ไม่ทับซ้อนกันได้อย่างแม่นยำ ส่วนครอบคลุมสองจุดขึ้นไป จุดสิ้นสุดของแต่ละส่วนของเส้นตรงต้องมีพิกัดเชิงปริพันธ์ ส่วนของเส้นตรง k ไม่จำเป็นต้องครอบคลุม n จุดที่กำหนดทั้งหมด และสามารถแบ่งปันจุดปลายได้ หากคำตอบมีขนาดใหญ่เกินไป ให้คืนค่า mod ผลลัพธ์ 10^9+7

ดังนั้น ถ้าอินพุตเป็นเหมือน n =4 k =2 ผลลัพธ์จะเป็น 5 เพราะเราสร้างความเป็นไปได้ได้ห้าอย่าง [(0 ถึง 2),(2 ถึง 3)], [(0 ถึง 1),(1 ถึง 3)], [(0 ถึง 1),(2 ถึง 3)], [(1 ถึง 2),(2 ถึง 3)] และ [(0 ถึง 1),(1 ถึง 2)]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ม :=10^9 + 7
  • n :=n - 1
  • กำหนดฟังก์ชัน dp() นี้จะใช้เวลา i, ครอบคลุม, j
  • ถ้าฉันเหมือนกับ n แล้ว
    • คืนค่า จริง ถ้า j เหมือนกับ k มิฉะนั้น เท็จ
  • ถ้า j> k แล้ว
  • เช่น :=dp(i + 1, เท็จ, j) + dp(i + 1, จริง, j + 1)
  • ถ้าครอบคลุมเป็นจริงแล้ว
    • ans :=ans + dp(i + 1, True, j)
  • ส่งคืน mod m
  • จากวิธีหลักส่งคืน dp(0, False, 0)

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def solve(n, k):
   m = 10 ** 9 + 7
   n -= 1

   def dp(i, covered, j):
      if i == n:
         return j == k
      if j > k:
         return 0
      ans = dp(i + 1, False, j) + dp(i + 1, True, j + 1)
      if covered:
         ans += dp(i + 1, True, j)
      return ans % m

   return dp(0, False, 0)

n = 4
k = 2
print(solve(n, k))

อินพุต

4, 2

ผลลัพธ์

5