Skip to content

Commit da9dcd6

Browse files
committed
feat: problems for the next week
1 parent ddf48b4 commit da9dcd6

File tree

5 files changed

+111
-18
lines changed

5 files changed

+111
-18
lines changed

leetcode/contest-292/6059. Check if There Is a Valid Parentheses String Path.js

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,25 @@
44
*/
55
const hasValidPath = function (grid) {
66
const m = grid.length; const n = grid[0].length
7-
grid = grid.map(g => g.map((a) => a === '(' ? 1 : -1))
8-
if ((m + n) % 2 === 0) return false
9-
const max = Array(m).fill(0).map(() => Array(n).fill(-1e5))
10-
const min = Array(m).fill(0).map(() => Array(n).fill(1e5))
11-
if (grid[0][0] >= 0) min[0][0] = grid[0][0], max[0][0] = grid[0][0]
12-
// console.log(grid)
7+
const dp = Array(m).fill(0).map(() => Array(n).fill(0).map(() => new Set()))
8+
139
for (let i = 0; i < m; i++) {
1410
for (let j = 0; j < n; j++) {
15-
// 从 [i-1, j] 过来
16-
if (i >= 1) {
17-
// tmpMin < 0 但是 tmpMax >= 0 的情况,我们 i, j 仍然合法,min 值为 0
18-
const tmpMin = min[i - 1][j] + grid[i][j]; const tmpMax = max[i - 1][j] + grid[i][j]
19-
if (tmpMax >= 0) min[i][j] = Math.min(min[i][j], Math.max(tmpMin, 0))
20-
if (tmpMax >= 0) max[i][j] = Math.max(max[i][j], tmpMax)
11+
if (i === 0 && j === 0) {
12+
if (grid[0][0] === '(') dp[0][0].add(1)
13+
continue
2114
}
22-
// 从 [i, j-1] 过来
23-
if (j >= 1) {
24-
const tmpMin = min[i][j - 1] + grid[i][j]; const tmpMax = max[i][j - 1] + grid[i][j]
25-
if (tmpMax >= 0) min[i][j] = Math.min(min[i][j], Math.max(tmpMin, 0))
26-
if (tmpMax >= 0) max[i][j] = Math.max(max[i][j], tmpMax)
15+
16+
const s = new Set()
17+
if (i - 1 >= 0) [...dp[i - 1][j]].forEach(x => s.add(x))
18+
if (j - 1 >= 0) [...dp[i][j - 1]].forEach(x => s.add(x))
19+
20+
for (const c of s) {
21+
const x = c + (grid[i][j] === '(' ? 1 : -1)
22+
if (x >= 0) dp[i][j].add(x)
23+
// console.log(i, j, dp[i][j])
2724
}
2825
}
2926
}
30-
return min[m - 1][n - 1] === 0 && max[m - 1][n - 1] >= 0
27+
return dp[m - 1][n - 1].has(0)
3128
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @param {number[]} slices
3+
* @return {number}
4+
*/
5+
const maxSizeSlices = function (s) {
6+
const n = s.length
7+
return Math.max(
8+
// 第 0 个不选
9+
solve(1, n - 1, n / 3),
10+
// 最后一个不选
11+
solve(0, n - 2, n / 3)
12+
)
13+
function solve (l, r, cnt) {
14+
// dp[i][j][k] 到 i 为止,选了 j 个的最大价值,k=0表示最后一个不选
15+
const dp = Array(r + 1).fill(0).map(() => Array(cnt + 1).fill(0).map(() => Array(2).fill(0)))
16+
dp[l][1][1] = s[l]
17+
18+
for (let i = l + 1; i <= r; i++) {
19+
for (let j = 1; j <= Math.min(cnt, i - l + 1); j++) {
20+
dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1])
21+
dp[i][j][1] = dp[i - 1][j - 1][0] + s[i]
22+
}
23+
}
24+
25+
return Math.max(dp[r][cnt][0], dp[r][cnt][1])
26+
}
27+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var rob = function(nums) {
6+
const n = nums.length
7+
const dp = Array(n).fill(0).map(() => [])
8+
dp[0][0] = 0, dp[0][1] = nums[0]
9+
for (let i = 1; i < n; i++) {
10+
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0])
11+
dp[i][1] = dp[i-1][0] + nums[i]
12+
}
13+
return Math.max(dp[n-1][0], dp[n-1][1])
14+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var rob = function(nums) {
6+
if (nums.length === 1) return nums[0]
7+
const n = nums.length
8+
// dp[i][j][k] j 表示第 i 个有没有被 rob
9+
// k 表示第 1 个有没有被 rob
10+
const dp = Array(n).fill(0).map(() => Array(2).fill(0).map(() => Array(2).fill(0)))
11+
dp[0][0][0] = 0, dp[0][0][1] = -1
12+
dp[0][1][0] = -1, dp[0][1][1] = nums[0]
13+
for (let i = 1; i < n; i++) {
14+
dp[i][0][0] = Math.max(dp[i-1][1][0], dp[i-1][0][0])
15+
dp[i][0][1] = Math.max(dp[i-1][1][1], dp[i-1][0][1])
16+
17+
dp[i][1][0] = Math.max(dp[i-1][0][0], 0) + nums[i]
18+
dp[i][1][1] = Math.max(dp[i-1][0][1], 0) + nums[i]
19+
}
20+
return Math.max(dp[n-1][0][0], dp[n-1][0][1], dp[n-1][1][0])
21+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
*/
5+
const distinctSequences = function (n) {
6+
if (n === 1) return 6
7+
// dp[i][j][k] 长为 i, 最后两个元素是 j, k
8+
// dp[1][.][.] = 1
9+
const dp = Array(n).fill(0).map(() => Array(7).fill(0).map(() => Array(7).fill(0)))
10+
const gcd = (a, b) => b ? gcd(b, a % b) : a
11+
for (let j = 1; j <= 6; j++) {
12+
for (let k = 1; k <= 6; k++) {
13+
if (j !== k && gcd(j, k) === 1) dp[1][j][k] = 1
14+
}
15+
}
16+
let ans = 0; const P = 1e9 + 7
17+
for (let i = 2; i < n; i++) {
18+
for (let j = 1; j <= 6; j++) {
19+
for (let k = 1; k <= 6; k++) {
20+
for (let l = 1; l <= 6; l++) {
21+
if (gcd(l, k) > 1) continue
22+
if (l === k || l === j) continue
23+
dp[i][k][l] = (dp[i][k][l] + dp[i - 1][j][k]) % P
24+
}
25+
}
26+
}
27+
}
28+
for (let j = 1; j <= 6; j++) {
29+
for (let k = 1; k <= 6; k++) {
30+
ans = (ans + dp[n - 1][j][k]) % P
31+
}
32+
}
33+
return ans
34+
}

0 commit comments

Comments
 (0)