|
| 1 | +# Time: O(n * m) |
| 2 | +# Space: O(n * m) |
| 3 | + |
| 4 | +# dp |
| 5 | +class Solution(object): |
| 6 | + def numberOfStableArrays(self, zero, one, limit): |
| 7 | + """ |
| 8 | + :type zero: int |
| 9 | + :type one: int |
| 10 | + :type limit: int |
| 11 | + :rtype: int |
| 12 | + """ |
| 13 | + MOD = 10**9+7 |
| 14 | + dp = [[[0]*2 for _ in xrange(one+1)] for _ in xrange(zero+1)] |
| 15 | + for i in xrange(zero+1): |
| 16 | + dp[i][0][0] = 1 if i <= limit else 0 |
| 17 | + for j in xrange(one+1): |
| 18 | + dp[0][j][1] = 1 if j <= limit else 0 |
| 19 | + for i in xrange(1, zero+1): |
| 20 | + for j in xrange(1, one+1): |
| 21 | + dp[i][j][0] = (dp[i-1][j][0]+dp[i-1][j][1])%MOD |
| 22 | + dp[i][j][1] = (dp[i][j-1][0]+dp[i][j-1][1])%MOD |
| 23 | + if i-limit-1 >= 0: |
| 24 | + dp[i][j][0] = (dp[i][j][0]-dp[i-limit-1][j][1])%MOD |
| 25 | + if j-limit-1 >= 0: |
| 26 | + dp[i][j][1] = (dp[i][j][1]-dp[i][j-limit-1][0])%MOD |
| 27 | + return (dp[-1][-1][0]+dp[-1][-1][1])%MOD |
| 28 | + |
| 29 | + |
| 30 | +# Time: O(n * m * l) |
| 31 | +# Space: O(n * m) |
| 32 | +# dp |
| 33 | +class Solution2(object): |
| 34 | + def numberOfStableArrays(self, zero, one, limit): |
| 35 | + """ |
| 36 | + :type zero: int |
| 37 | + :type one: int |
| 38 | + :type limit: int |
| 39 | + :rtype: int |
| 40 | + """ |
| 41 | + MOD = 10**9+7 |
| 42 | + dp = [[[0]*2 for _ in xrange(one+1)] for _ in xrange(zero+1)] |
| 43 | + dp[0][0][0] = dp[0][0][1] = 1 |
| 44 | + for i in xrange(zero+1): |
| 45 | + for j in xrange(one+1): |
| 46 | + for k in xrange(1, limit+1): |
| 47 | + if i-k >= 0: |
| 48 | + dp[i][j][0] = (dp[i][j][0]+dp[i-k][j][1])%MOD |
| 49 | + if j-k >= 0: |
| 50 | + dp[i][j][1] = (dp[i][j][1]+dp[i][j-k][0])%MOD |
| 51 | + return (dp[-1][-1][0]+dp[-1][-1][1])%MOD |
0 commit comments