Skip to content

Commit b9ed105

Browse files
authored
Merge pull request #90 from Debashis08/feature-dp-implementation
fix: size_t warning fix, house robber 2 init
2 parents 57d1920 + 0adefcb commit b9ed105

File tree

9 files changed

+183
-10
lines changed

9 files changed

+183
-10
lines changed

include/0005_DynamicProgramming/0004_MinimumCostClimbingStairs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace MinimumCostClimbingStairs
1717
class DynamicProgramming
1818
{
1919
private:
20-
int MinCostRecursive(int step, vector<int>& cost);
20+
int MinCostRecursive(size_t step, vector<int>& cost);
2121
public:
2222
int RecursiveMinimumCostClimbingStairs(vector<int>& cost);
2323
int DpMinimumCostClimbingStairs(vector<int>& cost);

include/0005_DynamicProgramming/0005_HouseRobber1.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace HouseRobber1
1717
class DynamicProgramming
1818
{
1919
private:
20-
int MaxLootRecursive(int house, vector<int>& houseValues);
20+
int MaxLootRecursive(size_t house, vector<int>& houseValues);
2121
public:
2222
int RecursiveMaximumLoot(vector<int>& houseValues);
2323
int DpMaximumLoot(vector<int>& houseValues);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
#include<vector>
3+
using namespace std;
4+
5+
/*
6+
Pattern 1
7+
Linear Recurrence
8+
9+
Description
10+
You are given an array arr[] which represents houses arranged in a circle, where each house has a certain value. A thief aims to maximize the total stolen value without robbing two adjacent houses.
11+
Determine the maximum amount the thief can steal.
12+
13+
Note: Since the houses are in a circle, the first and last houses are also considered adjacent.
14+
15+
*/
16+
17+
namespace HouseRobber2
18+
{
19+
class DynamicProgramming
20+
{
21+
private:
22+
int MaxLootRecursive(size_t house, vector<int>& houseValues);
23+
int MaxLootDp(size_t firstHouse, size_t lastHouse, vector<int>& houseValues);
24+
public:
25+
int RecursiveMaximumLoot(vector<int>& houseValues);
26+
int DpMaximumLoot(vector<int>& houseValues);
27+
};
28+
}

source/0005_DynamicProgramming/0004_MinimumCostClimbingStairs.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace MinimumCostClimbingStairs
55
{
6-
int DynamicProgramming::MinCostRecursive(int step, vector<int>& cost)
6+
int DynamicProgramming::MinCostRecursive(size_t step, vector<int>& cost)
77
{
88
if (step == 0 || step == 1)
99
{
@@ -15,7 +15,7 @@ namespace MinimumCostClimbingStairs
1515

1616
int DynamicProgramming::RecursiveMinimumCostClimbingStairs(vector<int>& cost)
1717
{
18-
int totalSteps = cost.size();
18+
size_t totalSteps = cost.size();
1919

2020
if (totalSteps == 1)
2121
{
@@ -27,7 +27,7 @@ namespace MinimumCostClimbingStairs
2727

2828
int DynamicProgramming::DpMinimumCostClimbingStairs(vector<int>& cost)
2929
{
30-
int totalSteps = cost.size();
30+
size_t totalSteps = cost.size();
3131
vector<int> dp(totalSteps, 0);
3232

3333
if (totalSteps == 1)
@@ -38,7 +38,7 @@ namespace MinimumCostClimbingStairs
3838
dp[0] = cost[0];
3939
dp[1] = cost[1];
4040

41-
for (int i = 2; i < totalSteps; i++)
41+
for (size_t i = 2; i < totalSteps; i++)
4242
{
4343
dp[i] = cost[i] + min(dp[i - 1], dp[i - 2]);
4444
}

source/0005_DynamicProgramming/0005_HouseRobber1.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace HouseRobber1
44
{
5-
int DynamicProgramming::MaxLootRecursive(int house, vector<int>& houseValues)
5+
int DynamicProgramming::MaxLootRecursive(size_t house, vector<int>& houseValues)
66
{
77
if (house <= 0)
88
{
@@ -22,19 +22,19 @@ namespace HouseRobber1
2222

2323
int DynamicProgramming::RecursiveMaximumLoot(vector<int>& houseValues)
2424
{
25-
int totalNumberOfHouses = houseValues.size();
25+
size_t totalNumberOfHouses = houseValues.size();
2626
return this->MaxLootRecursive(totalNumberOfHouses, houseValues);
2727
}
2828

2929
int DynamicProgramming::DpMaximumLoot(vector<int>& houseValues)
3030
{
31-
int totalNumberOfHouses = houseValues.size();
31+
size_t totalNumberOfHouses = houseValues.size();
3232
vector<int> dp(totalNumberOfHouses + 1, 0);
3333

3434
dp[0] = 0;
3535
dp[1] = houseValues[0];
3636

37-
for (int i = 2; i <= totalNumberOfHouses; i++)
37+
for (size_t i = 2; i <= totalNumberOfHouses; i++)
3838
{
3939
dp[i] = max(dp[i - 2] + houseValues[i - 1], dp[i - 1]);
4040
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#include "../../include/0005_DynamicProgramming/0006_HouseRobber2.h"
2+
3+
namespace HouseRobber2
4+
{
5+
int DynamicProgramming::MaxLootRecursive(size_t 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::MaxLootDp(size_t firstHouse, size_t lastHouse, vector<int>& houseValues)
24+
{
25+
int totalNumberOfHouses = lastHouse - firstHouse + 1;
26+
27+
if (totalNumberOfHouses == 0)
28+
{
29+
return 0;
30+
}
31+
32+
if (totalNumberOfHouses == 1)
33+
{
34+
return houseValues[firstHouse];
35+
}
36+
37+
vector<int> dp(totalNumberOfHouses, 0);
38+
39+
dp[0] = houseValues[firstHouse];
40+
dp[1] = max(houseValues[firstHouse], houseValues[firstHouse + 1]);
41+
42+
for (size_t i = 2; i < totalNumberOfHouses; i++)
43+
{
44+
dp[i] = max(houseValues[firstHouse + i] + dp[i - 2], dp[i - 1]);
45+
}
46+
47+
return dp[totalNumberOfHouses - 1];
48+
}
49+
50+
int DynamicProgramming::RecursiveMaximumLoot(vector<int>& houseValues)
51+
{
52+
if (houseValues.size() == 0)
53+
{
54+
return 0;
55+
}
56+
57+
if (houseValues.size() == 1)
58+
{
59+
return houseValues[0];
60+
}
61+
62+
size_t totalNumberOfHouses = houseValues.size()-1;
63+
64+
// Case 1: Exclude last house.
65+
vector<int> pickFirstHouse(houseValues.begin(), houseValues.end() - 1);
66+
67+
// Case 2: Exlcude first house.
68+
vector<int> pickLastHouse(houseValues.begin() + 1, houseValues.end());
69+
70+
return max(this->MaxLootRecursive(totalNumberOfHouses, pickFirstHouse), this->MaxLootRecursive(totalNumberOfHouses, pickLastHouse));
71+
}
72+
73+
int DynamicProgramming::DpMaximumLoot(vector<int>& houseValues)
74+
{
75+
size_t totalNumberOfHouses = houseValues.size();
76+
77+
if (totalNumberOfHouses == 0)
78+
{
79+
return 0;
80+
}
81+
82+
if (totalNumberOfHouses == 1)
83+
{
84+
return houseValues[0];
85+
}
86+
87+
// Case 1: Exclude last house.
88+
int pickFirstHouse = this->MaxLootDp(0, totalNumberOfHouses - 2, houseValues);
89+
90+
// Case 2: Exlcude first house.
91+
int pickLastHouse = this->MaxLootDp(1, totalNumberOfHouses - 1, houseValues);
92+
93+
return max(pickFirstHouse, pickLastHouse);
94+
}
95+
}

source/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ set(0005DYNAMICPROGRAMMING_SOURCES
55
0003_ClimbingStairs.cc
66
0004_MinimumCostClimbingStairs.cc
77
0005_HouseRobber1.cc
8+
0006_HouseRobber2.cc
89

910
)
1011

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include<gtest/gtest.h>
2+
#include "../../include/0005_DynamicProgramming/0006_HouseRobber2.h"
3+
4+
namespace HouseRobber2
5+
{
6+
TEST(HouseRobber2, RecursionTest01)
7+
{
8+
// Arrange
9+
DynamicProgramming dp;
10+
vector<int> houseValues = { 2, 2, 3, 1, 2 };
11+
int expectedMaximumLoot = 5;
12+
13+
// Act
14+
int actualMaximumLoot = dp.RecursiveMaximumLoot(houseValues);
15+
16+
// Assert
17+
ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot);
18+
}
19+
20+
TEST(HouseRobber2, DpTest01)
21+
{
22+
// Arrange
23+
DynamicProgramming dp;
24+
vector<int> houseValues = { 2, 2, 3, 1, 2 };
25+
int expectedMaximumLoot = 5;
26+
27+
// Act
28+
int actualMaximumLoot = dp.DpMaximumLoot(houseValues);
29+
30+
// Assert
31+
ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot);
32+
}
33+
34+
TEST(HouseRobber2, DpTest02)
35+
{
36+
// Arrange
37+
DynamicProgramming dp;
38+
vector<int> houseValues = { 9, 1, 8, 2 };
39+
int expectedMaximumLoot = 17;
40+
41+
// Act
42+
int actualMaximumLoot = dp.DpMaximumLoot(houseValues);
43+
44+
// Assert
45+
ASSERT_EQ(expectedMaximumLoot, actualMaximumLoot);
46+
}
47+
48+
}

test/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ add_executable(
1919
0003_ClimbingStairsTest.cc
2020
0004_MinimumCostClimbingStairsTest.cc
2121
0005_HouseRobber1Test.cc
22+
0006_HouseRobber2Test.cc
2223

2324
)
2425

0 commit comments

Comments
 (0)