@@ -54,15 +54,22 @@ Dynamic programming.
54
54
class Solution :
55
55
def minimumTotal (self , triangle : List[List[int ]]) -> int :
56
56
n = len (triangle)
57
- for i in range (1 , n):
57
+ dp = [[0 ] * (n + 1 ) for _ in range (n + 1 )]
58
+ for i in range (n - 1 , - 1 , - 1 ):
58
59
for j in range (i + 1 ):
59
- mi = float (' inf' )
60
- if j > 0 :
61
- mi = min (mi, triangle[i - 1 ][j - 1 ])
62
- if j < i:
63
- mi = min (mi, triangle[i - 1 ][j])
64
- triangle[i][j] += mi
65
- return min (triangle[n - 1 ])
60
+ dp[i][j] = min (dp[i + 1 ][j], dp[i + 1 ][j + 1 ]) + triangle[i][j]
61
+ return dp[0 ][0 ]
62
+ ```
63
+
64
+ ``` python
65
+ class Solution :
66
+ def minimumTotal (self , triangle : List[List[int ]]) -> int :
67
+ n = len (triangle)
68
+ dp = [0 ] * (n + 1 )
69
+ for i in range (n - 1 , - 1 , - 1 ):
70
+ for j in range (i + 1 ):
71
+ dp[j] = min (dp[j], dp[j + 1 ]) + triangle[i][j]
72
+ return dp[0 ]
66
73
```
67
74
68
75
### ** Java**
@@ -71,23 +78,13 @@ class Solution:
71
78
class Solution {
72
79
public int minimumTotal (List<List<Integer > > triangle ) {
73
80
int n = triangle. size();
74
- for (int i = 1 ; i < n; ++ i) {
75
- for (int j = 0 ; j < i + 1 ; ++ j) {
76
- int mi = Integer . MAX_VALUE ;
77
- if (j > 0 ) {
78
- mi = Math . min(mi, triangle. get(i - 1 ). get(j - 1 ));
79
- }
80
- if (j < i) {
81
- mi = Math . min(mi, triangle. get(i - 1 ). get(j));
82
- }
83
- triangle. get(i). set(j, triangle. get(i). get(j) + mi);
81
+ int [] dp = new int [n + 1 ];
82
+ for (int i = n - 1 ; i >= 0 ; -- i) {
83
+ for (int j = 0 ; j <= i; ++ j) {
84
+ dp[j] = Math . min(dp[j], dp[j + 1 ]) + triangle. get(i). get(j);
84
85
}
85
86
}
86
- int res = Integer . MAX_VALUE ;
87
- for (int val : triangle. get(n - 1 )) {
88
- res = Math . min(res, val);
89
- }
90
- return res;
87
+ return dp[0 ];
91
88
}
92
89
}
93
90
```
@@ -99,19 +96,15 @@ class Solution {
99
96
public:
100
97
int minimumTotal(vector<vector<int >>& triangle) {
101
98
int n = triangle.size();
102
- for ( int i = 1; i < n; ++i) {
103
- for (int j = 0; j < i + 1; ++j) {
104
- int mi = INT_MAX;
105
- if (j > 0) mi = min(mi, triangle [ i - 1 ] [ j - 1 ] );
106
- if (j < i) mi = min(mi, triangle [ i - 1 ] [ j ] );
107
- triangle [ i ] [ j ] += mi ;
99
+ vector< int > dp(n + 1);
100
+ for (int i = n - 1; i >= 0; --i)
101
+ {
102
+ for (int j = 0; j <= i; ++j)
103
+ {
104
+ dp [ j ] = min(dp [ j] , dp [ j + 1 ] ) + triangle [ i ] [ j ] ;
108
105
}
109
106
}
110
- int res = INT_MAX;
111
- for (int& val : triangle[ n - 1] ) {
112
- res = min(res, val);
113
- }
114
- return res;
107
+ return dp[ 0] ;
115
108
}
116
109
};
117
110
```
@@ -121,26 +114,20 @@ public:
121
114
```go
122
115
func minimumTotal(triangle [][]int) int {
123
116
n := len(triangle)
124
- for i := 1; i < n; i++ {
125
- for j := 0; j < i+1; j++ {
126
- mi := 2000000
127
- if j > 0 && mi > triangle[i-1][j-1] {
128
- mi = triangle[i-1][j-1]
129
- }
130
- if j < i && mi > triangle[i-1][j] {
131
- mi = triangle[i-1][j]
132
- }
133
- triangle[i][j] += mi
117
+ dp := make([]int, n+1)
118
+ for i := n - 1; i >= 0; i-- {
119
+ for j := 0; j <= i; j++ {
120
+ dp[j] = min(dp[j], dp[j+1]) + triangle[i][j]
134
121
}
135
122
}
123
+ return dp[0]
124
+ }
136
125
137
- res := 2000000
138
- for j := 0; j < n; j++ {
139
- if res > triangle[n-1][j] {
140
- res = triangle[n-1][j]
141
- }
126
+ func min(a, b int) int {
127
+ if a < b {
128
+ return a
142
129
}
143
- return res
130
+ return b
144
131
}
145
132
```
146
133
0 commit comments