1
+ // Problem : Given a triangle array, return the minimum path sum from top to bottom. For each step, you may move to an
2
+ // adjacent number of the row below.More formally, if you are on index i on the current row, you may move to either
3
+ // index i or index i + 1 on the next row.
4
+
5
+ #include < bits/stdc++.h>
6
+ using namespace std ;
7
+
8
+ int minimumTotal (vector<vector<int >> &triangle)
9
+ {
10
+ int n = triangle.size ();
11
+ vector<vector<int >> dp (n);
12
+ for (int i = 0 ; i < n; i++)
13
+ {
14
+ for (int j = 0 ; j < triangle[i].size (); j++)
15
+ {
16
+ if (i == 0 and j == 0 )
17
+ {
18
+ // very first cell
19
+ dp[i].push_back (triangle[i][j]);
20
+ }
21
+ else if (j == 0 )
22
+ {
23
+ // we can jump to this cell by one way(⬇️)
24
+ dp[i].push_back (dp[i - 1 ][j] + triangle[i][j]);
25
+ }
26
+ else if (j == (triangle[i].size () - 1 ))
27
+ {
28
+ // we can jump to this cell by one way(↘️)
29
+ dp[i].push_back (dp[i - 1 ][j - 1 ] + triangle[i][j]);
30
+ }
31
+ else
32
+ {
33
+ // we can jump to this cell by two ways(⬇️ and ↘️)
34
+ dp[i].push_back (min (dp[i - 1 ][j], dp[i - 1 ][j - 1 ]) + triangle[i][j]);
35
+ }
36
+ }
37
+ }
38
+ // returning the minimum out of all calculated sums
39
+ return *min_element (dp[n - 1 ].begin (), dp[n - 1 ].end ());
40
+ }
41
+ int main ()
42
+ {
43
+ int n;
44
+ cin >> n;
45
+ vector<vector<int >> triangle (n);
46
+ for (int i = 0 ; i < n; i++)
47
+ {
48
+ for (int j = 0 ; j <= i; j++)
49
+ {
50
+ int x;
51
+ cin >> x;
52
+ triangle[i].push_back (x);
53
+ }
54
+ }
55
+ cout << minimumTotal (triangle);
56
+ }
57
+
58
+ // Sample Inputs
59
+
60
+ // Sample Inputs
61
+
62
+ // Sample Inputs
63
+
64
+ // 4
65
+ // 2
66
+ // 3 4
67
+ // 6 5 7
68
+ // 4 1 8 3
69
+
70
+ // 1
71
+ // -10
72
+
73
+ // Corresponding Outputs
74
+
75
+ // 11
76
+
77
+ // -10
0 commit comments