// Package q3129 implements a solution for https://leetcode.com/problems/find-all-possible-stable-binary-arrays-i/ package q3129 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