ในปัญหานี้ เราได้รับบ้าน n หลังที่มีค่าบางอย่างในนั้น งานของเราคือค้นหามูลค่าสูงสุดที่ขโมยมาจากบ้าน
คำอธิบายปัญหา − เรามีบ้านอาร์เรย์[] ที่ประกอบด้วยค่าที่อยู่ในแต่ละบ้าน โจรปล้นบ้าน แต่เขาไม่สามารถขโมยจากบ้านสองหลังที่อยู่ติดกันได้เนื่องจากเพื่อนบ้านรู้เรื่องการโจรกรรม เราต้องหามูลค่าสูงสุดที่สามารถขโมยได้จากบ้านโดยไม่ถูกจับได้
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
houses[] = {5, 2, 1, 6, 7, 9, 4, 3}
ผลลัพธ์
23
คำอธิบาย
The max values can be stolen as : 5, 6, 9, 3.
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาสามารถพบได้โดยใช้การเขียนโปรแกรมแบบไดนามิก เนื่องจากเราจำเป็นต้องค้นหามูลค่าสูงสุดที่ขโมยมาโดยหัวขโมย เช่น ถ้าเขาขโมยจากบ้านที่ดัชนี i เขาจะไม่สามารถขโมยจากบ้านที่ดัชนี (i+1) อีกทั้งเราจะไม่ขโมยของจากบ้านที่ดัชนี (i-1) เพื่อแก้ปัญหา เราจะสร้างอาร์เรย์ DP ขนาด n และสำหรับกรณีพื้นฐาน เราจะเริ่มต้น DP[0] ด้วย house[0] และ DP[1] ด้วย house[1] จากนั้น เราจะหาค่าทั้งหมดของ DP จากดัชนี 2 ถึง n-1 ค่าของDP[i]จะเป็นค่าสูงสุดจาก DP[i-2] + house[i] หรือ DP[i-1] และสุดท้ายค่าสุดท้ายของอาร์เรย์ DP คือค่าสูงสุดที่สามารถขโมยได้
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> using namespace std; int calMax(int a, int b){ if(a > b) return a; return b; } int findMaxValuesStolen(int houses[], int n) { if (n == 0) return 0; int DP[n]; DP[0] = houses[0]; DP[1] = calMax(houses[0], houses[1]); for (int i = 2; i<n; i++) DP[i] = calMax( (houses[i] + DP[i-2]), DP[i-1]); return DP[n-1]; } int main() { int houses[] = {5, 2, 1, 6, 7, 9, 4, 3}; int n = sizeof(houses)/sizeof(houses[0]); cout<<"The maximum possible values stolen from the houses is "<<findMaxValuesStolen(houses, n); return 0; }
ผลลัพธ์
The maximum possible values stolen from the houses is 23
วิธีแก้ปัญหานี้ดี แต่สามารถทำให้มีประสิทธิภาพมากขึ้นโดยใช้ข้อเท็จจริงที่ว่าค่าสูงสุดที่ถูกขโมยนั้นสามารถพบได้โดยใช้เพียงสองค่าเท่านั้น เช่นเดียวกับใน DP เราใช้เพียงสองค่าสำหรับแต่ละดัชนี ดังนั้น เราจึงใช้ตัวแปรได้เพียง 2 ตัวในการค้นหาวิธีแก้ปัญหาคือลดความซับซ้อนของพื้นที่ลง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> using namespace std; int calMax(int a, int b){ if(a > b) return a; return b; } int findMaxValuesStolen(int houses[], int n) { if (n == 0) return 0; int maxValStolen; int val1 = houses[0]; int val2 = calMax(houses[0], houses[1]); for (int i = 2; i<n; i++) { maxValStolen = calMax( (houses[i]+val1) , val2); val1 = val2; val2 = maxValStolen; } return maxValStolen; } int main() { int houses[] = {5, 2, 1, 6, 7, 9, 4, 3}; int n = sizeof(houses)/sizeof(houses[0]); cout<<"The maximum possible values stolen from the houses is "<<findMaxValuesStolen(houses, n); return 0; }
ผลลัพธ์
The maximum possible values stolen from the houses is 23