-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCTCI-8.1.cpp
More file actions
60 lines (46 loc) · 1.29 KB
/
CTCI-8.1.cpp
File metadata and controls
60 lines (46 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Triple Step
#include <bits/stdc++.h>
using namespace std;
class Counter {
private:
map<int,int> waysForSteps; // numSteps ==> numWays (memoisation)
public:
int countWays(int numSteps) {
if(waysForSteps.count(numSteps) == 1) return waysForSteps[numSteps];
if(numSteps < 0) return 0; // So 1 step gives 1
if(numSteps == 0) return 1;
int numWays = countWays(numSteps-1)
+ countWays(numSteps-2)
+ countWays(numSteps-3);
waysForSteps[numSteps] = numWays;
return numWays;
}
};
int recursive() {
int numSteps;
Counter counter;
cin >> numSteps;
cout << counter.countWays(numSteps) << "\n";
return 0;
}
int iterative() {
// TODO
int numSteps;
cin >> numSteps;
int numWays = 1;
int numWays1StepBefore = 0;
int numWays2StepsBefore = 0;
int numWays3StepsBefore = 0;
for(int i = 0; i < numSteps; i++) {
numWays3StepsBefore = numWays2StepsBefore;
numWays2StepsBefore = numWays1StepBefore;
numWays1StepBefore = numWays;
numWays = numWays1StepBefore + numWays2StepsBefore + numWays3StepsBefore;
}
cout << numWays;
return 0;
}
int main() {
recursive();
return iterative();
}