45 lines
1 KiB
Go
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
|