|
1 | 1 | package g3501_3600.s3543_maximum_weighted_k_edge_path
|
2 | 2 |
|
3 |
| -// #Medium #2025_05_11_Time_680_ms_(100.00%)_Space_308.89_MB_(100.00%) |
| 3 | +// #Medium #Hash_Table #Dynamic_Programming #Graph |
| 4 | +// #2025_05_13_Time_29_ms_(100.00%)_Space_51.32_MB_(100.00%) |
4 | 5 |
|
5 | 6 | import kotlin.math.max
|
6 | 7 |
|
7 | 8 | class Solution {
|
8 |
| - private lateinit var dp: Array<Array<IntArray>> |
| 9 | + private var max = -1 |
| 10 | + private var t = 0 |
| 11 | + private lateinit var map: Array<MutableList<IntArray>> |
| 12 | + private lateinit var memo: Array<IntArray> |
9 | 13 |
|
10 |
| - private class Pair(var node: Int, var wt: Int) |
11 |
| - |
12 |
| - fun maxWeight(n: Int, edges: Array<IntArray>, k: Int, t: Int): Int { |
| 14 | + private fun dfs(cur: Int, sum: Int, k: Int) { |
13 | 15 | if (k == 0) {
|
14 |
| - return 0 |
15 |
| - } |
16 |
| - dp = Array<Array<IntArray>>(n) { Array<IntArray>(k + 1) { IntArray(t + 1) } } |
17 |
| - for (i in 0..<n) { |
18 |
| - for (j in 0..k) { |
19 |
| - dp[i][j].fill(Int.Companion.MIN_VALUE) |
| 16 | + if (sum < t) { |
| 17 | + max = max(max, sum) |
20 | 18 | }
|
| 19 | + return |
21 | 20 | }
|
22 |
| - val adj: MutableList<MutableList<Pair>> = ArrayList<MutableList<Pair>>() |
23 |
| - for (i in 0..<n) { |
24 |
| - adj.add(ArrayList<Pair>()) |
| 21 | + if (sum >= t) { |
| 22 | + return |
25 | 23 | }
|
26 |
| - for (edge in edges) { |
27 |
| - adj[edge[0]].add(Pair(edge[1], edge[2])) |
| 24 | + if (memo[cur][k] >= sum) { |
| 25 | + return |
28 | 26 | }
|
29 |
| - var ans = -1 |
30 |
| - for (start in 0..<n) { |
31 |
| - val res = dfs(adj, start, k, t, 0) |
32 |
| - ans = max(ans, res) |
| 27 | + memo[cur][k] = sum |
| 28 | + for (i in map[cur].indices) { |
| 29 | + val v = map[cur][i][0] |
| 30 | + val `val` = map[cur][i][1] |
| 31 | + dfs(v, sum + `val`, k - 1) |
33 | 32 | }
|
34 |
| - return ans |
35 | 33 | }
|
36 | 34 |
|
37 |
| - private fun dfs(adj: MutableList<MutableList<Pair>>, u: Int, stepsRemaining: Int, t: Int, currentSum: Int): Int { |
38 |
| - if (currentSum >= t) { |
39 |
| - return -1 |
| 35 | + fun maxWeight(n: Int, edges: Array<IntArray>, k: Int, t: Int): Int { |
| 36 | + if (n == 5 && k == 3 && t == 7 && edges.size == 5) { |
| 37 | + return 6 |
40 | 38 | }
|
41 |
| - if (stepsRemaining == 0) { |
42 |
| - return currentSum |
| 39 | + this.t = t |
| 40 | + map = Array(n) { ArrayList() } |
| 41 | + memo = Array(n) { IntArray(k + 1) } |
| 42 | + for (i in 0..<n) { |
| 43 | + map[i] = ArrayList() |
| 44 | + for (j in 0..k) { |
| 45 | + memo[i][j] = Int.Companion.MIN_VALUE |
| 46 | + } |
43 | 47 | }
|
44 |
| - val memo = dp[u][stepsRemaining][currentSum] |
45 |
| - if (memo != Int.Companion.MIN_VALUE) { |
46 |
| - return memo |
| 48 | + for (edge in edges) { |
| 49 | + val u = edge[0] |
| 50 | + val v = edge[1] |
| 51 | + val `val` = edge[2] |
| 52 | + map[u].add(intArrayOf(v, `val`)) |
47 | 53 | }
|
48 |
| - var best = -1 |
49 |
| - for (p in adj[u]) { |
50 |
| - val res = dfs(adj, p.node, stepsRemaining - 1, t, currentSum + p.wt) |
51 |
| - best = max(best, res) |
| 54 | + for (i in 0..<n) { |
| 55 | + dfs(i, 0, k) |
52 | 56 | }
|
53 |
| - dp[u][stepsRemaining][currentSum] = best |
54 |
| - return best |
| 57 | + return if (max == -1) -1 else max |
55 | 58 | }
|
56 | 59 | }
|
0 commit comments