Skip to content

Commit abedc9f

Browse files
authored
feat: add solutions to lc problem: No.3077 (doocs#2440)
No.3077.Maximum Strength of K Disjoint Subarrays
1 parent 8d52cc8 commit abedc9f

File tree

18 files changed

+406
-29
lines changed

18 files changed

+406
-29
lines changed

solution/3000-3099/3063.Linked List Frequency/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<!-- 这里写题目描述 -->
1010

11-
<p>给定包含 <code>k</code> 个&nbsp;<strong>不同&nbsp;</strong>元素的链表的&nbsp;<code>head</code>&nbsp;节点,返回包含给定链表中每个 <strong>不同元素</strong> 以 <strong>任何顺序</strong> 出现的 <span data-keyword="frequency-linkedlist">频率</span> 的长度为&nbsp;<code>k</code>&nbsp;的链表的头节点。</p>
11+
<p>给定包含 <code>k</code> 个&nbsp;<strong>不同&nbsp;</strong>元素的链表的&nbsp;<code>head</code>&nbsp;节点,创建一个长度为&nbsp;<code>k</code>&nbsp;的链表,包含给定链表中每个 <strong>不同元素</strong> 以 <strong>任何顺序</strong> 出现的 <span data-keyword="frequency-linkedlist">频率</span>&nbsp;。返回这个链表的头节点。</p>
1212

1313
<p>&nbsp;</p>
1414

solution/3000-3099/3073.Maximum Increasing Triplet Value/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[English Version](/solution/3000-3099/3073.Maximum%20Increasing%20Triplet%20Value/README_EN.md)
44

5-
<!-- tags: -->
5+
<!-- tags:数组,有序集合 -->
66

77
## 题目描述
88

solution/3000-3099/3073.Maximum Increasing Triplet Value/README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[中文文档](/solution/3000-3099/3073.Maximum%20Increasing%20Triplet%20Value/README.md)
44

5-
<!-- tags: -->
5+
<!-- tags:Array,Ordered Set -->
66

77
## Description
88

solution/3000-3099/3074.Apple Redistribution into Boxes/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[English Version](/solution/3000-3099/3074.Apple%20Redistribution%20into%20Boxes/README_EN.md)
44

5-
<!-- tags: -->
5+
<!-- tags:贪心,数组,排序 -->
66

77
## 题目描述
88

solution/3000-3099/3074.Apple Redistribution into Boxes/README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[中文文档](/solution/3000-3099/3074.Apple%20Redistribution%20into%20Boxes/README.md)
44

5-
<!-- tags: -->
5+
<!-- tags:Greedy,Array,Sorting -->
66

77
## Description
88

solution/3000-3099/3075.Maximize Happiness of Selected Children/README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[English Version](/solution/3000-3099/3075.Maximize%20Happiness%20of%20Selected%20Children/README_EN.md)
44

5-
<!-- tags: -->
5+
<!-- tags:贪心,数组,排序 -->
66

77
## 题目描述
88

@@ -121,6 +121,18 @@ func maximumHappinessSum(happiness []int, k int) (ans int64) {
121121
}
122122
```
123123

124+
```ts
125+
function maximumHappinessSum(happiness: number[], k: number): number {
126+
happiness.sort((a, b) => b - a);
127+
let ans = 0;
128+
for (let i = 0; i < k; ++i) {
129+
const x = happiness[i] - i;
130+
ans += Math.max(x, 0);
131+
}
132+
return ans;
133+
}
134+
```
135+
124136
<!-- tabs:end -->
125137

126138
<!-- end -->

solution/3000-3099/3075.Maximize Happiness of Selected Children/README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[中文文档](/solution/3000-3099/3075.Maximize%20Happiness%20of%20Selected%20Children/README.md)
44

5-
<!-- tags: -->
5+
<!-- tags:Greedy,Array,Sorting -->
66

77
## Description
88

solution/3000-3099/3076.Shortest Uncommon Substring in an Array/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[English Version](/solution/3000-3099/3076.Shortest%20Uncommon%20Substring%20in%20an%20Array/README_EN.md)
44

5-
<!-- tags: -->
5+
<!-- tags:字典树,数组,哈希表,字符串 -->
66

77
## 题目描述
88

solution/3000-3099/3076.Shortest Uncommon Substring in an Array/README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[中文文档](/solution/3000-3099/3076.Shortest%20Uncommon%20Substring%20in%20an%20Array/README.md)
44

5-
<!-- tags: -->
5+
<!-- tags:Trie,Array,Hash Table,String -->
66

77
## Description
88

solution/3000-3099/3077.Maximum Strength of K Disjoint Subarrays/README.md

Lines changed: 131 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[English Version](/solution/3000-3099/3077.Maximum%20Strength%20of%20K%20Disjoint%20Subarrays/README_EN.md)
44

5-
<!-- tags: -->
5+
<!-- tags:数组,动态规划,前缀和 -->
66

77
## 题目描述
88

@@ -58,24 +58,150 @@
5858

5959
## 解法
6060

61-
### 方法一
61+
### 方法一:动态规划
62+
63+
对于第 $i$ 个数 $nums[i - 1]$,如果它被选择,且位于第 $j$ 个子数组,那么它对答案的贡献是 $nums[i - 1] \times (k - j + 1) \times (-1)^{j+1}$,我们不妨将 $(-1)^{j+1}$ 记为 $sign$,那么它对答案的贡献是 $sign \times nums[i - 1] \times (k - j + 1)$。
64+
65+
我们定义 $f[i][j][0]$ 表示从前 $i 个数中选择 $j$ 个子数组,且第 $i$ 个数不被选的最大能量值,定义 $f[i][j][1]$ 表示从前 $i$ 个数中选择 $j$ 个子数组,且第 $i$ 个数被选的最大能量值。初始时 $f[0][0][1] = 0$,其余的值都是 $-\infty$。
66+
67+
当 $i > 0$ 时,我们考虑 $f[i][j]$ 如何进行状态转移。
68+
69+
如果第 $i$ 个数不被选,那么第 $i-1$ 个数既可以被选,也可以不被选,所以 $f[i][j][0] = \max(f[i-1][j][0], f[i-1][j][1])$。
70+
71+
如果第 $i$ 个数被选,此时如果第 $i-1$ 个数与第 $i$ 个数位于同一个子数组中,那么 $f[i][j][1] = \max(f[i][j][1], f[i-1][j][1] + sign \times nums[i-1] \times (k - j + 1))$,否则 $f[i][j][1] = \max(f[i][j][1], \max(f[i-1][j-1][0], f[i-1][j-1][1]) + sign \times nums[i-1] \times (k - j + 1))$。我们取这两种情况的最大值作为 $f[i][j][1]$。
72+
73+
最终答案是 $\max(f[n][k][0], f[n][k][1])$。
74+
75+
时间复杂度 $O(n \times k)$,空间复杂度 $O(n \times k)$。其中 $n$ 是数组 $nums$ 的长度。
6276

6377
<!-- tabs:start -->
6478

6579
```python
66-
80+
class Solution:
81+
def maximumStrength(self, nums: List[int], k: int) -> int:
82+
n = len(nums)
83+
f = [[[-inf, -inf] for _ in range(k + 1)] for _ in range(n + 1)]
84+
f[0][0][0] = 0
85+
for i, x in enumerate(nums, 1):
86+
for j in range(k + 1):
87+
sign = 1 if j & 1 else -1
88+
f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1])
89+
f[i][j][1] = max(f[i][j][1], f[i - 1][j][1] + sign * x * (k - j + 1))
90+
if j:
91+
f[i][j][1] = max(
92+
f[i][j][1], max(f[i - 1][j - 1]) + sign * x * (k - j + 1)
93+
)
94+
return max(f[n][k])
6795
```
6896

6997
```java
70-
98+
class Solution {
99+
public long maximumStrength(int[] nums, int k) {
100+
int n = nums.length;
101+
long[][][] f = new long[n + 1][k + 1][2];
102+
for (int i = 0; i <= n; i++) {
103+
for (int j = 0; j <= k; j++) {
104+
Arrays.fill(f[i][j], Long.MIN_VALUE / 2);
105+
}
106+
}
107+
f[0][0][0] = 0;
108+
for (int i = 1; i <= n; i++) {
109+
int x = nums[i - 1];
110+
for (int j = 0; j <= k; j++) {
111+
long sign = (j & 1) == 1 ? 1 : -1;
112+
long val = sign * x * (k - j + 1);
113+
f[i][j][0] = Math.max(f[i - 1][j][0], f[i - 1][j][1]);
114+
f[i][j][1] = Math.max(f[i][j][1], f[i - 1][j][1] + val);
115+
if (j > 0) {
116+
long t = Math.max(f[i - 1][j - 1][0], f[i - 1][j - 1][1]) + val;
117+
f[i][j][1] = Math.max(f[i][j][1], t);
118+
}
119+
}
120+
}
121+
return Math.max(f[n][k][0], f[n][k][1]);
122+
}
123+
}
71124
```
72125

73126
```cpp
74-
127+
class Solution {
128+
public:
129+
long long maximumStrength(vector<int>& nums, int k) {
130+
int n = nums.size();
131+
long long f[n + 1][k + 1][2];
132+
memset(f, -0x3f3f3f3f3f3f3f3f, sizeof(f));
133+
f[0][0][0] = 0;
134+
for (int i = 1; i <= n; i++) {
135+
int x = nums[i - 1];
136+
for (int j = 0; j <= k; j++) {
137+
long long sign = (j & 1) == 1 ? 1 : -1;
138+
long long val = sign * x * (k - j + 1);
139+
f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1]);
140+
f[i][j][1] = max(f[i][j][1], f[i - 1][j][1] + val);
141+
if (j > 0) {
142+
long long t = max(f[i - 1][j - 1][0], f[i - 1][j - 1][1]) + val;
143+
f[i][j][1] = max(f[i][j][1], t);
144+
}
145+
}
146+
}
147+
return max(f[n][k][0], f[n][k][1]);
148+
}
149+
};
75150
```
76151
77152
```go
153+
func maximumStrength(nums []int, k int) int64 {
154+
n := len(nums)
155+
f := make([][][]int64, n+1)
156+
const inf int64 = math.MinInt64 / 2
157+
for i := range f {
158+
f[i] = make([][]int64, k+1)
159+
for j := range f[i] {
160+
f[i][j] = []int64{inf, inf}
161+
}
162+
}
163+
f[0][0][0] = 0
164+
for i := 1; i <= n; i++ {
165+
x := nums[i-1]
166+
for j := 0; j <= k; j++ {
167+
sign := int64(-1)
168+
if j&1 == 1 {
169+
sign = 1
170+
}
171+
val := sign * int64(x) * int64(k-j+1)
172+
f[i][j][0] = max(f[i-1][j][0], f[i-1][j][1])
173+
f[i][j][1] = max(f[i][j][1], f[i-1][j][1]+val)
174+
if j > 0 {
175+
t := max(f[i-1][j-1][0], f[i-1][j-1][1]) + val
176+
f[i][j][1] = max(f[i][j][1], t)
177+
}
178+
}
179+
}
180+
return max(f[n][k][0], f[n][k][1])
181+
}
182+
```
78183

184+
```ts
185+
function maximumStrength(nums: number[], k: number): number {
186+
const n: number = nums.length;
187+
const f: number[][][] = Array.from({ length: n + 1 }, () =>
188+
Array.from({ length: k + 1 }, () => [-Infinity, -Infinity]),
189+
);
190+
f[0][0][0] = 0;
191+
for (let i = 1; i <= n; i++) {
192+
const x: number = nums[i - 1];
193+
for (let j = 0; j <= k; j++) {
194+
const sign: number = (j & 1) === 1 ? 1 : -1;
195+
const val: number = sign * x * (k - j + 1);
196+
f[i][j][0] = Math.max(f[i - 1][j][0], f[i - 1][j][1]);
197+
f[i][j][1] = Math.max(f[i][j][1], f[i - 1][j][1] + val);
198+
if (j > 0) {
199+
f[i][j][1] = Math.max(f[i][j][1], Math.max(...f[i - 1][j - 1]) + val);
200+
}
201+
}
202+
}
203+
return Math.max(...f[n][k]);
204+
}
79205
```
80206

81207
<!-- tabs:end -->

0 commit comments

Comments
 (0)