@@ -145,25 +145,317 @@ source: 第 163 场双周赛 Q4
145145#### Python3
146146
147147``` python
148-
148+ class Solution :
149+ def minCost (self , grid : List[List[int ]], k : int ) -> int :
150+ m, n = len (grid), len (grid[0 ])
151+ f = [[[inf] * n for _ in range (m)] for _ in range (k + 1 )]
152+ f[0 ][0 ][0 ] = 0
153+ for i in range (m):
154+ for j in range (n):
155+ if i:
156+ f[0 ][i][j] = min (f[0 ][i][j], f[0 ][i - 1 ][j] + grid[i][j])
157+ if j:
158+ f[0 ][i][j] = min (f[0 ][i][j], f[0 ][i][j - 1 ] + grid[i][j])
159+ g = defaultdict(list )
160+ for i, row in enumerate (grid):
161+ for j, x in enumerate (row):
162+ g[x].append((i, j))
163+ keys = sorted (g, reverse = True )
164+ for t in range (1 , k + 1 ):
165+ mn = inf
166+ for key in keys:
167+ pos = g[key]
168+ for i, j in pos:
169+ mn = min (mn, f[t - 1 ][i][j])
170+ for i, j in pos:
171+ f[t][i][j] = mn
172+ for i in range (m):
173+ for j in range (n):
174+ if i:
175+ f[t][i][j] = min (f[t][i][j], f[t][i - 1 ][j] + grid[i][j])
176+ if j:
177+ f[t][i][j] = min (f[t][i][j], f[t][i][j - 1 ] + grid[i][j])
178+ return min (f[t][m - 1 ][n - 1 ] for t in range (k + 1 ))
149179```
150180
151181#### Java
152182
153183``` java
154-
184+ class Solution {
185+ public int minCost (int [][] grid , int k ) {
186+ int m = grid. length, n = grid[0 ]. length;
187+ int inf = Integer . MAX_VALUE / 2 ;
188+
189+ int [][][] f = new int [k + 1 ][m][n];
190+ for (int t = 0 ; t <= k; t++ ) {
191+ for (int i = 0 ; i < m; i++ ) {
192+ Arrays . fill(f[t][i], inf);
193+ }
194+ }
195+
196+ f[0 ][0 ][0 ] = 0 ;
197+ for (int i = 0 ; i < m; i++ ) {
198+ for (int j = 0 ; j < n; j++ ) {
199+ if (i > 0 ) {
200+ f[0 ][i][j] = Math . min(f[0 ][i][j], f[0 ][i - 1 ][j] + grid[i][j]);
201+ }
202+ if (j > 0 ) {
203+ f[0 ][i][j] = Math . min(f[0 ][i][j], f[0 ][i][j - 1 ] + grid[i][j]);
204+ }
205+ }
206+ }
207+
208+ Map<Integer , List<int[]> > g = new HashMap<> ();
209+ for (int i = 0 ; i < m; i++ ) {
210+ for (int j = 0 ; j < n; j++ ) {
211+ int x = grid[i][j];
212+ g. computeIfAbsent(x, z - > new ArrayList<> ()). add(new int [] {i, j});
213+ }
214+ }
215+
216+ List<Integer > keys = new ArrayList<> (g. keySet());
217+ keys. sort(Collections . reverseOrder());
218+
219+ for (int t = 1 ; t <= k; t++ ) {
220+ int mn = inf;
221+ for (int key : keys) {
222+ List<int[]> pos = g. get(key);
223+ for (int [] p : pos) {
224+ mn = Math . min(mn, f[t - 1 ][p[0 ]][p[1 ]]);
225+ }
226+ for (int [] p : pos) {
227+ f[t][p[0 ]][p[1 ]] = mn;
228+ }
229+ }
230+ for (int i = 0 ; i < m; i++ ) {
231+ for (int j = 0 ; j < n; j++ ) {
232+ if (i > 0 ) {
233+ f[t][i][j] = Math . min(f[t][i][j], f[t][i - 1 ][j] + grid[i][j]);
234+ }
235+ if (j > 0 ) {
236+ f[t][i][j] = Math . min(f[t][i][j], f[t][i][j - 1 ] + grid[i][j]);
237+ }
238+ }
239+ }
240+ }
241+
242+ int ans = inf;
243+ for (int t = 0 ; t <= k; t++ ) {
244+ ans = Math . min(ans, f[t][m - 1 ][n - 1 ]);
245+ }
246+ return ans;
247+ }
248+ }
155249```
156250
157251#### C++
158252
159253``` cpp
160-
254+ class Solution {
255+ public:
256+ int minCost(vector<vector<int >>& grid, int k) {
257+ int m = grid.size(), n = grid[ 0] .size();
258+ int inf = INT_MAX / 2;
259+
260+ vector<vector<vector<int>>> f(k + 1, vector<vector<int>>(m, vector<int>(n, inf)));
261+
262+ f[0][0][0] = 0;
263+ for (int i = 0; i < m; i++) {
264+ for (int j = 0; j < n; j++) {
265+ if (i > 0) {
266+ f[0][i][j] = min(f[0][i][j], f[0][i - 1][j] + grid[i][j]);
267+ }
268+ if (j > 0 ) {
269+ f[0][i][j] = min(f[0][i][j], f[0][i][j - 1] + grid[i][j]);
270+ }
271+ }
272+ }
273+
274+ unordered_map<int, vector<pair<int, int>>> g;
275+ for (int i = 0; i < m; i++) {
276+ for (int j = 0; j < n; j++) {
277+ int x = grid[i][j];
278+ g[x].push_back({i, j});
279+ }
280+ }
281+
282+ vector<int> keys;
283+ keys.reserve(g.size());
284+ for (auto& e : g) {
285+ keys.push_back(e.first);
286+ }
287+ sort (keys.begin(), keys.end(), greater<int >());
288+
289+ for (int t = 1; t <= k; t++) {
290+ int mn = inf;
291+ for (int key : keys) {
292+ auto& pos = g[key];
293+ for (auto& p : pos) {
294+ mn = min(mn, f[t - 1][p.first][p.second]);
295+ }
296+ for (auto& p : pos) {
297+ f[t][p.first][p.second] = mn;
298+ }
299+ }
300+ for (int i = 0; i < m; i++) {
301+ for (int j = 0; j < n; j++) {
302+ if (i > 0) {
303+ f[t][i][j] = min(f[t][i][j], f[t][i - 1][j] + grid[i][j]);
304+ }
305+ if (j > 0) {
306+ f[t][i][j] = min(f[t][i][j], f[t][i][j - 1] + grid[i][j]);
307+ }
308+ }
309+ }
310+ }
311+
312+ int ans = inf;
313+ for (int t = 0; t <= k; t++) {
314+ ans = min(ans, f[t][m - 1][n - 1]);
315+ }
316+ return ans;
317+ }
318+ };
161319```
162320
163321#### Go
164322
165323``` go
324+ func minCost (grid [][]int , k int ) int {
325+ m , n := len (grid), len (grid[0 ])
326+ inf := int (^uint (0 )>>1 ) / 4
327+
328+ f := make ([][][]int , k+1 )
329+ for t := 0 ; t <= k; t++ {
330+ f[t] = make ([][]int , m)
331+ for i := 0 ; i < m; i++ {
332+ f[t][i] = make ([]int , n)
333+ for j := 0 ; j < n; j++ {
334+ f[t][i][j] = inf
335+ }
336+ }
337+ }
338+
339+ f[0 ][0 ][0 ] = 0
340+ for i := 0 ; i < m; i++ {
341+ for j := 0 ; j < n; j++ {
342+ if i > 0 {
343+ f[0 ][i][j] = min (f[0 ][i][j], f[0 ][i-1 ][j]+grid[i][j])
344+ }
345+ if j > 0 {
346+ f[0 ][i][j] = min (f[0 ][i][j], f[0 ][i][j-1 ]+grid[i][j])
347+ }
348+ }
349+ }
350+
351+ g := make (map [int ][][]int )
352+ for i := 0 ; i < m; i++ {
353+ for j := 0 ; j < n; j++ {
354+ x := grid[i][j]
355+ g[x] = append (g[x], []int {i, j})
356+ }
357+ }
358+
359+ keys := make ([]int , 0 , len (g))
360+ for key := range g {
361+ keys = append (keys, key)
362+ }
363+ sort.Sort (sort.Reverse (sort.IntSlice (keys)))
364+
365+ for t := 1 ; t <= k; t++ {
366+ mn := inf
367+ for _ , key := range keys {
368+ pos := g[key]
369+ for _ , p := range pos {
370+ mn = min (mn, f[t-1 ][p[0 ]][p[1 ]])
371+ }
372+ for _ , p := range pos {
373+ f[t][p[0 ]][p[1 ]] = mn
374+ }
375+ }
376+ for i := 0 ; i < m; i++ {
377+ for j := 0 ; j < n; j++ {
378+ if i > 0 {
379+ f[t][i][j] = min (f[t][i][j], f[t][i-1 ][j]+grid[i][j])
380+ }
381+ if j > 0 {
382+ f[t][i][j] = min (f[t][i][j], f[t][i][j-1 ]+grid[i][j])
383+ }
384+ }
385+ }
386+ }
387+
388+ ans := inf
389+ for t := 0 ; t <= k; t++ {
390+ ans = min (ans, f[t][m-1 ][n-1 ])
391+ }
392+ return ans
393+ }
394+ ```
166395
396+ #### TypeScript
397+
398+ ``` ts
399+ function minCost(grid : number [][], k : number ): number {
400+ const [m, n] = [grid .length , grid [0 ].length ];
401+ const INF = 1e18 ;
402+
403+ const f: number [][][] = Array .from ({ length: k + 1 }, () =>
404+ Array .from ({ length: m }, () => Array (n ).fill (INF )),
405+ );
406+
407+ f [0 ][0 ][0 ] = 0 ;
408+ for (let i = 0 ; i < m ; i ++ ) {
409+ for (let j = 0 ; j < n ; j ++ ) {
410+ if (i > 0 ) f [0 ][i ][j ] = Math .min (f [0 ][i ][j ], f [0 ][i - 1 ][j ] + grid [i ][j ]);
411+ if (j > 0 ) f [0 ][i ][j ] = Math .min (f [0 ][i ][j ], f [0 ][i ][j - 1 ] + grid [i ][j ]);
412+ }
413+ }
414+
415+ const g = new Map <number , Array <[number , number ]>>();
416+ for (let i = 0 ; i < m ; i ++ ) {
417+ for (let j = 0 ; j < n ; j ++ ) {
418+ const x = grid [i ][j ];
419+ if (! g .has (x )) {
420+ g .set (x , []);
421+ }
422+ g .get (x )! .push ([i , j ]);
423+ }
424+ }
425+
426+ const keys = Array .from (g .keys ()).sort ((a , b ) => b - a );
427+
428+ for (let t = 1 ; t <= k ; t ++ ) {
429+ let mn = INF ;
430+
431+ for (const key of keys ) {
432+ const pos = g .get (key )! ;
433+ for (const [x, y] of pos ) {
434+ mn = Math .min (mn , f [t - 1 ][x ][y ]);
435+ }
436+ for (const [x, y] of pos ) {
437+ f [t ][x ][y ] = mn ;
438+ }
439+ }
440+
441+ for (let i = 0 ; i < m ; i ++ ) {
442+ for (let j = 0 ; j < n ; j ++ ) {
443+ if (i > 0 ) {
444+ f [t ][i ][j ] = Math .min (f [t ][i ][j ], f [t ][i - 1 ][j ] + grid [i ][j ]);
445+ }
446+ if (j > 0 ) {
447+ f [t ][i ][j ] = Math .min (f [t ][i ][j ], f [t ][i ][j - 1 ] + grid [i ][j ]);
448+ }
449+ }
450+ }
451+ }
452+
453+ let ans = INF ;
454+ for (let t = 0 ; t <= k ; t ++ ) {
455+ ans = Math .min (ans , f [t ][m - 1 ][n - 1 ]);
456+ }
457+ return ans ;
458+ }
167459```
168460
169461<!-- tabs:end -->
0 commit comments