From ea193daa7f302b3ec30743e7f0b4f650e25ba243 Mon Sep 17 00:00:00 2001 From: Debashis Nandi Date: Wed, 6 Aug 2025 23:04:26 +0530 Subject: [PATCH] feature: house robber 1 solution added --- .../0005_HouseRobber1.h | 25 +++++++++++ .../0005_HouseRobber1.cc | 44 +++++++++++++++++++ source/0005_DynamicProgramming/CMakeLists.txt | 1 + .../0005_HouseRobber1Test.cc | 33 ++++++++++++++ test/0005_DynamicProgramming/CMakeLists.txt | 1 + 5 files changed, 104 insertions(+) create mode 100644 include/0005_DynamicProgramming/0005_HouseRobber1.h create mode 100644 source/0005_DynamicProgramming/0005_HouseRobber1.cc create mode 100644 test/0005_DynamicProgramming/0005_HouseRobber1Test.cc diff --git a/include/0005_DynamicProgramming/0005_HouseRobber1.h b/include/0005_DynamicProgramming/0005_HouseRobber1.h new file mode 100644 index 0000000..b348a43 --- /dev/null +++ b/include/0005_DynamicProgramming/0005_HouseRobber1.h @@ -0,0 +1,25 @@ +#pragma once +#include +using namespace std; + +/* +Pattern 1 +Linear Recurrence + +Description +There are n houses built in a line, each of which contains some money in it. +A robber wants to steal money from these houses, but he can’t steal from two adjacent houses. The task is to find the maximum amount of money which can be stolen. + +*/ + +namespace HouseRobber1 +{ + class DynamicProgramming + { + private: + int MaxLootRecursive(int house, vector& houseValues); + public: + int RecursiveMaximumLoot(vector& houseValues); + int DpMaximumLoot(vector& houseValues); + }; +} \ No newline at end of file diff --git a/source/0005_DynamicProgramming/0005_HouseRobber1.cc b/source/0005_DynamicProgramming/0005_HouseRobber1.cc new file mode 100644 index 0000000..e9c20dc --- /dev/null +++ b/source/0005_DynamicProgramming/0005_HouseRobber1.cc @@ -0,0 +1,44 @@ +#include "../../include/0005_DynamicProgramming/0005_HouseRobber1.h" + +namespace HouseRobber1 +{ + int DynamicProgramming::MaxLootRecursive(int house, vector& houseValues) + { + if (house <= 0) + { + return 0; + } + + if (house == 1) + { + return houseValues[0]; + } + + int pickCurrentHouse = houseValues[house - 1] + this->MaxLootRecursive(house - 2, houseValues); + int dropCurrentHouse = this->MaxLootRecursive(house - 1, houseValues); + + return max(pickCurrentHouse, dropCurrentHouse); + } + + int DynamicProgramming::RecursiveMaximumLoot(vector& houseValues) + { + int totalNumberOfHouses = houseValues.size(); + return this->MaxLootRecursive(totalNumberOfHouses, houseValues); + } + + int DynamicProgramming::DpMaximumLoot(vector& houseValues) + { + int totalNumberOfHouses = houseValues.size(); + vector dp(totalNumberOfHouses + 1, 0); + + dp[0] = 0; + dp[1] = houseValues[0]; + + for (int i = 2; i <= totalNumberOfHouses; i++) + { + dp[i] = max(dp[i - 2] + houseValues[i - 1], dp[i - 1]); + } + + return dp[totalNumberOfHouses]; + } +} \ No newline at end of file diff --git a/source/0005_DynamicProgramming/CMakeLists.txt b/source/0005_DynamicProgramming/CMakeLists.txt index 3f1d08c..1f82b05 100644 --- a/source/0005_DynamicProgramming/CMakeLists.txt +++ b/source/0005_DynamicProgramming/CMakeLists.txt @@ -4,6 +4,7 @@ set(0005DYNAMICPROGRAMMING_SOURCES 0002_TribonacciNumber.cc 0003_ClimbingStairs.cc 0004_MinimumCostClimbingStairs.cc + 0005_HouseRobber1.cc ) diff --git a/test/0005_DynamicProgramming/0005_HouseRobber1Test.cc b/test/0005_DynamicProgramming/0005_HouseRobber1Test.cc new file mode 100644 index 0000000..8b27601 --- /dev/null +++ b/test/0005_DynamicProgramming/0005_HouseRobber1Test.cc @@ -0,0 +1,33 @@ +#include +#include "../../include/0005_DynamicProgramming/0005_HouseRobber1.h" + +namespace HouseRobber1 +{ + TEST(HouseRobber1, RecursionTest) + { + // Arrange + DynamicProgramming dp; + vector houseValues = { 6, 7, 1, 3, 8, 2, 4 }; + int expectedMaximumLoot = 19; + + // Act + int actualMaximumLoot = dp.RecursiveMaximumLoot(houseValues); + + // Assert + ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot); + } + + TEST(HouseRobber1, DpTest) + { + // Arrange + DynamicProgramming dp; + vector houseValues = { 6, 7, 1, 3, 8, 2, 4 }; + int expectedMaximumLoot = 19; + + // Act + int actualMaximumLoot = dp.DpMaximumLoot(houseValues); + + // Assert + ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot); + } +} \ No newline at end of file diff --git a/test/0005_DynamicProgramming/CMakeLists.txt b/test/0005_DynamicProgramming/CMakeLists.txt index 57447d2..fb6723a 100644 --- a/test/0005_DynamicProgramming/CMakeLists.txt +++ b/test/0005_DynamicProgramming/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable( 0002_TribonacciNumberTest.cc 0003_ClimbingStairsTest.cc 0004_MinimumCostClimbingStairsTest.cc + 0005_HouseRobber1Test.cc )