สมมติว่าเรามีรายการวันที่เรียงลำดับ days ที่ต้องขึ้นรถบัส ต้องหาค่าใช้จ่ายต่ำสุด มีบัตร 3 ประเภท: บัตร 1 วัน ราคา 2, บัตร 7 วัน ราคา 7, บัตร 30 วัน ราคา 25
ตัวอย่าง
อินพุต: days = [1, 3, 5, 6, 28]
เอาต์พุต: 9
ซื้อบัตร 7 วันตั้งแต่วันที่ 1 (ครอบคลุมถึงวันที่ 7) และบัตร 1 วันสำหรับวันที่ 28 รวม 7+2=9
ขั้นตอนการแก้ปัญหา
ใช้ Dynamic Programming (DP):
n = max(days)- แปลง
daysเป็น set เพื่อตรวจสอบ O(1) - สร้างอาร์เรย์
dpขนาดn+1เริ่มต้น 0 - วน
iจาก 1 ถึงn:- ถ้า
iไม่อยู่ในdays:dp[i] = dp[i-1] - ถ้าอยู่:
- ถ้า
i >= 30:dp[i] = min(dp[i-1]+2, dp[i-7]+7, dp[i-30]+25) - ถ้า
i >= 7:dp[i] = min(dp[i-1]+2, dp[i-7]+7, 25) - มิฉะนั้น:
dp[i] = min(dp[i-1]+2, 7)
- ถ้า
- ถ้า
- คืนค่า
dp[n]
การนำไปใช้ใน Python
class Solution:
def solve(self, days):
n = max(days)
days = set(days)
dp = [0] * (n + 1)
for i in range(1, n + 1):
if i in days:
if i >= 30:
dp[i] = min(dp[i - 1] + 2, dp[i - 7] + 7, dp[i - 30] + 25)
elif i >= 7:
dp[i] = min(dp[i - 1] + 2, dp[i - 7] + 7, 25)
else:
dp[i] = min(dp[i - 1] + 2, 7)
else:
dp[i] = dp[i - 1]
return dp[n]
ob = Solution()
days = [1, 3, 5, 6, 28]
print(ob.solve(days))
อินพุต
[1, 3, 5, 6, 28]
เอาต์พุต
9