Skip to content

Commit addca6e

Browse files
committed
feature: min cost climbing added
1 parent b707e7c commit addca6e

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-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+
Given an array of integers cost[] of length n, where cost[i] is the cost of the ith step on a staircase. Once the cost is paid, we can either climb 1 or 2 steps.
11+
We can either start from the step with index 0, or the step with index 1. The task is to find the minimum cost to reach the top.
12+
13+
*/
14+
15+
namespace MinimumCostClimbingStairs
16+
{
17+
class DynamicProgramming
18+
{
19+
private:
20+
int MinCostRecursive(int step, vector<int>& cost);
21+
public:
22+
int RecursiveMinimumCostClimbingStairs(vector<int>& cost);
23+
int DpMinimumCostClimbingStairs(vector<int>& cost);
24+
};
25+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "../../include/0005_DynamicProgramming/0004_MinimumCostClimbingStairs.h"
2+
#include<algorithm>
3+
4+
namespace MinimumCostClimbingStairs
5+
{
6+
int DynamicProgramming::MinCostRecursive(int step, vector<int>& cost)
7+
{
8+
if (step == 0 || step == 1)
9+
{
10+
return cost[step];
11+
}
12+
13+
return cost[step] + min(this->MinCostRecursive(step - 1, cost), this->MinCostRecursive(step - 2, cost));
14+
}
15+
16+
int DynamicProgramming::RecursiveMinimumCostClimbingStairs(vector<int>& cost)
17+
{
18+
int totalSteps = cost.size();
19+
20+
if (totalSteps == 1)
21+
{
22+
return cost[0];
23+
}
24+
25+
return min(this->MinCostRecursive(totalSteps - 1, cost), this->MinCostRecursive(totalSteps - 2, cost));
26+
}
27+
28+
int DynamicProgramming::DpMinimumCostClimbingStairs(vector<int>& cost)
29+
{
30+
int totalSteps = cost.size();
31+
vector<int> dp(totalSteps, 0);
32+
33+
if (totalSteps == 1)
34+
{
35+
return cost[0];
36+
}
37+
38+
dp[0] = cost[0];
39+
dp[1] = cost[1];
40+
41+
for (int i = 2; i < totalSteps; i++)
42+
{
43+
dp[i] = cost[i] + min(dp[i - 1], dp[i - 2]);
44+
}
45+
46+
return min(dp[totalSteps - 1], dp[totalSteps - 2]);
47+
}
48+
}

source/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ set(0005DYNAMICPROGRAMMING_SOURCES
33
0001_FibonacciNumber.cc
44
0002_TribonacciNumber.cc
55
0003_ClimbingStairs.cc
6+
0004_MinimumCostClimbingStairs.cc
67

78
)
89

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/0004_MinimumCostClimbingStairs.h"
3+
4+
namespace MinimumCostClimbingStairs
5+
{
6+
TEST(MinimumCostClimbingStairs, RecursionTest)
7+
{
8+
// Arrange
9+
DynamicProgramming dp;
10+
vector<int> cost = { 16, 19, 10, 12, 18 };
11+
int expectedCost = 31;
12+
13+
// Act
14+
int actualCost = dp.RecursiveMinimumCostClimbingStairs(cost);
15+
16+
// Assert
17+
ASSERT_EQ(expectedCost, actualCost);
18+
}
19+
20+
TEST(MinimumCostClimbingStairs, DpTest)
21+
{
22+
// Arrange
23+
DynamicProgramming dp;
24+
vector<int> cost = { 16, 19, 10, 12, 18 };
25+
int expectedCost = 31;
26+
27+
// Act
28+
int actualCost = dp.DpMinimumCostClimbingStairs(cost);
29+
30+
// Assert
31+
ASSERT_EQ(expectedCost, actualCost);
32+
}
33+
}

test/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ add_executable(
1717
0001_FibonacciNumberTest.cc
1818
0002_TribonacciNumberTest.cc
1919
0003_ClimbingStairsTest.cc
20+
0004_MinimumCostClimbingStairsTest.cc
2021

2122
)
2223

0 commit comments

Comments
 (0)