lc-go/solutions/31/q3130/solution.go
2026-03-13 16:18:54 +09:00

45 lines
1 KiB
Go

// Package q3130 implements a solution for https://leetcode.com/problems/find-all-possible-stable-binary-arrays-ii/
package q3130
const MOD = 1e9 + 7
func alloc(zeros, ones int) [][][2]int {
buf := make([][2]int, (zeros+1)*(ones+1))
ret := make([][][2]int, zeros+1)
for i := range ret {
ret[i] = buf[i*(ones+1) : (i+1)*(ones+1)]
}
return ret
}
func numberOfStableArrays(zeros, ones, limit int) int {
dp := alloc(zeros, ones)
// dimensions: [zeros][ones][last_digit]
for z := 1; z <= min(limit, zeros); z++ {
dp[z][0][0] = 1
}
for o := 1; o <= min(limit, ones); o++ {
dp[0][o][1] = 1
}
for z := 1; z <= zeros; z++ {
for o := 1; o <= ones; o++ {
dp[z][o][0] = dp[z-1][o][1] + dp[z-1][o][0]
if z > limit {
dp[z][o][0] -= dp[z-1-limit][o][1]
}
dp[z][o][1] = dp[z][o-1][0] + dp[z][o-1][1]
if o > limit {
dp[z][o][1] -= dp[z][o-1-limit][0]
}
dp[z][o][0] = (dp[z][o][0] + MOD) % MOD
dp[z][o][1] = (dp[z][o][1] + MOD) % MOD
}
}
return (dp[zeros][ones][0] + dp[zeros][ones][1]) % MOD
}
var _ = numberOfStableArrays