Skip to content

Commit 57d1920

Browse files
authored
Merge pull request #89 from Debashis08/feature-dp-implementation
feature: house robber 1 solution added
2 parents 93da32a + ea193da commit 57d1920

File tree

5 files changed

+104
-0
lines changed

5 files changed

+104
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma once
2+
#include<vector>
3+
using namespace std;
4+
5+
/*
6+
Pattern 1
7+
Linear Recurrence
8+
9+
Description
10+
There are n houses built in a line, each of which contains some money in it.
11+
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.
12+
13+
*/
14+
15+
namespace HouseRobber1
16+
{
17+
class DynamicProgramming
18+
{
19+
private:
20+
int MaxLootRecursive(int house, vector<int>& houseValues);
21+
public:
22+
int RecursiveMaximumLoot(vector<int>& houseValues);
23+
int DpMaximumLoot(vector<int>& houseValues);
24+
};
25+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "../../include/0005_DynamicProgramming/0005_HouseRobber1.h"
2+
3+
namespace HouseRobber1
4+
{
5+
int DynamicProgramming::MaxLootRecursive(int house, vector<int>& houseValues)
6+
{
7+
if (house <= 0)
8+
{
9+
return 0;
10+
}
11+
12+
if (house == 1)
13+
{
14+
return houseValues[0];
15+
}
16+
17+
int pickCurrentHouse = houseValues[house - 1] + this->MaxLootRecursive(house - 2, houseValues);
18+
int dropCurrentHouse = this->MaxLootRecursive(house - 1, houseValues);
19+
20+
return max(pickCurrentHouse, dropCurrentHouse);
21+
}
22+
23+
int DynamicProgramming::RecursiveMaximumLoot(vector<int>& houseValues)
24+
{
25+
int totalNumberOfHouses = houseValues.size();
26+
return this->MaxLootRecursive(totalNumberOfHouses, houseValues);
27+
}
28+
29+
int DynamicProgramming::DpMaximumLoot(vector<int>& houseValues)
30+
{
31+
int totalNumberOfHouses = houseValues.size();
32+
vector<int> dp(totalNumberOfHouses + 1, 0);
33+
34+
dp[0] = 0;
35+
dp[1] = houseValues[0];
36+
37+
for (int i = 2; i <= totalNumberOfHouses; i++)
38+
{
39+
dp[i] = max(dp[i - 2] + houseValues[i - 1], dp[i - 1]);
40+
}
41+
42+
return dp[totalNumberOfHouses];
43+
}
44+
}

source/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set(0005DYNAMICPROGRAMMING_SOURCES
44
0002_TribonacciNumber.cc
55
0003_ClimbingStairs.cc
66
0004_MinimumCostClimbingStairs.cc
7+
0005_HouseRobber1.cc
78

89
)
910

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include<gtest/gtest.h>
2+
#include "../../include/0005_DynamicProgramming/0005_HouseRobber1.h"
3+
4+
namespace HouseRobber1
5+
{
6+
TEST(HouseRobber1, RecursionTest)
7+
{
8+
// Arrange
9+
DynamicProgramming dp;
10+
vector<int> houseValues = { 6, 7, 1, 3, 8, 2, 4 };
11+
int expectedMaximumLoot = 19;
12+
13+
// Act
14+
int actualMaximumLoot = dp.RecursiveMaximumLoot(houseValues);
15+
16+
// Assert
17+
ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot);
18+
}
19+
20+
TEST(HouseRobber1, DpTest)
21+
{
22+
// Arrange
23+
DynamicProgramming dp;
24+
vector<int> houseValues = { 6, 7, 1, 3, 8, 2, 4 };
25+
int expectedMaximumLoot = 19;
26+
27+
// Act
28+
int actualMaximumLoot = dp.DpMaximumLoot(houseValues);
29+
30+
// Assert
31+
ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot);
32+
}
33+
}

test/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ add_executable(
1818
0002_TribonacciNumberTest.cc
1919
0003_ClimbingStairsTest.cc
2020
0004_MinimumCostClimbingStairsTest.cc
21+
0005_HouseRobber1Test.cc
2122

2223
)
2324

0 commit comments

Comments
 (0)