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

ค้นหามูลค่าขโมยสูงสุดที่เป็นไปได้จากบ้านใน C++


ในปัญหานี้ เราได้รับบ้าน 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