File tree Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Dp solution
2
+ class Solution {
3
+ fun maxSumAfterPartitioning (arr : IntArray , k : Int ): Int {
4
+ val n = arr.size
5
+ val dp = IntArray (k)
6
+ dp[0 ] = arr[0 ]
7
+
8
+ for (i in 1 until n) {
9
+ var curMax = 0
10
+ var maxAtI = 0
11
+ for (j in i downTo (i - k + 1 )) {
12
+ if (j < 0 ) break
13
+
14
+ curMax = maxOf(curMax, arr[j])
15
+
16
+ val winLen = i - j + 1
17
+ val curSum = curMax * winLen
18
+ val subArrSum = if (j > 0 ) dp[(j - 1 ) % k] else dp[k - 1 ]
19
+
20
+ maxAtI = maxOf(maxAtI, curSum + subArrSum)
21
+ }
22
+
23
+ dp[i % k] = maxAtI
24
+ }
25
+
26
+ return dp[(n - 1 ) % k]
27
+ }
28
+ }
29
+
30
+ // recursion + memoization
31
+ class Solution {
32
+ fun maxSumAfterPartitioning (arr : IntArray , k : Int ): Int {
33
+ val n = arr.size
34
+ val dp = IntArray (n) { - 1 }
35
+
36
+ fun dfs (i : Int ): Int {
37
+ if (i == n) return 0
38
+ if (dp[i] != - 1 ) return dp[i]
39
+
40
+ var curMax = 0
41
+ var res = 0
42
+ for (j in i until minOf(n, i + k)) {
43
+ curMax = maxOf(curMax, arr[j])
44
+ val winLen = j - i + 1
45
+ res = maxOf(
46
+ res,
47
+ dfs(j + 1 ) + curMax * winLen
48
+ )
49
+ }
50
+
51
+ dp[i] = res
52
+ return res
53
+ }
54
+
55
+ return dfs(0 )
56
+ }
57
+ }
You can’t perform that action at this time.
0 commit comments