@@ -176,41 +176,34 @@ class Solution {
176
176
#### C++
177
177
178
178
``` cpp
179
- using ll = long long ;
180
-
181
179
class Solution {
182
180
public:
183
181
int numberOfStableArrays(int zero, int one, int limit) {
184
- this->limit = limit ;
185
- f = vector<vector<array<ll, 2>>>(zero + 1, vector<array<ll, 2>>(one + 1, {-1, -1})) ;
186
- return (dfs( zero, one, 0) + dfs(zero, one, 1)) % mod ;
187
- }
188
-
189
- private:
190
- const int mod = 1e9 + 7;
191
- int limit;
192
- vector<vector<array<ll, 2>>> f ;
193
-
194
- ll dfs(int i, int j, int k ) {
195
- if (i < 0 || j < 0) {
196
- return 0;
197
- }
198
- if (i == 0 ) {
199
- return k == 1 && j <= limit ;
200
- }
201
- if (j == 0) {
202
- return k == 0 && i <= limit;
203
- }
204
- ll& res = f[i][j][k] ;
205
- if (res != -1) {
182
+ const int mod = 1e9 + 7 ;
183
+ using ll = long long ;
184
+ vector<vector<array<ll, 2>>> f = vector<vector<array<ll, 2>>>( zero + 1, vector<array<ll, 2>>(one + 1, {-1, -1})) ;
185
+ auto dfs = [ & ] (auto&& dfs, int i, int j, int k) -> ll {
186
+ if (i < 0 || j < 0) {
187
+ return 0;
188
+ }
189
+ if (i == 0) {
190
+ return k == 1 && j <= limit ;
191
+ }
192
+ if (j == 0 ) {
193
+ return k == 0 && i <= limit;
194
+ }
195
+ ll& res = f [ i ] [ j ] [ k ] ;
196
+ if (res != -1 ) {
197
+ return res ;
198
+ }
199
+ if (k == 0) {
200
+ res = (dfs(dfs, i - 1, j, 0) + dfs(dfs, i - 1, j, 1) - dfs(dfs, i - limit - 1, j, 1) + mod) % mod ;
201
+ } else {
202
+ res = (dfs(dfs, i, j - 1, 0) + dfs(dfs, i, j - 1, 1) - dfs(dfs, i, j - limit - 1, 0) + mod) % mod ;
203
+ }
206
204
return res;
207
- }
208
- if (k == 0) {
209
- res = (dfs(i - 1, j, 0) + dfs(i - 1, j, 1) - dfs(i - limit - 1, j, 1) + mod) % mod;
210
- } else {
211
- res = (dfs(i, j - 1, 0) + dfs(i, j - 1, 1) - dfs(i, j - limit - 1, 0) + mod) % mod;
212
- }
213
- return res;
205
+ };
206
+ return (dfs(dfs, zero, one, 0) + dfs(dfs, zero, one, 1)) % mod;
214
207
}
215
208
};
216
209
```
@@ -259,6 +252,41 @@ func numberOfStableArrays(zero int, one int, limit int) int {
259
252
}
260
253
```
261
254
255
+ #### TypeScript
256
+
257
+ ``` ts
258
+ function numberOfStableArrays(zero : number , one : number , limit : number ): number {
259
+ const mod = 1e9 + 7 ;
260
+ const f: number [][][] = Array .from ({ length: zero + 1 }, () =>
261
+ Array .from ({ length: one + 1 }, () => [- 1 , - 1 ]),
262
+ );
263
+
264
+ const dfs = (i : number , j : number , k : number ): number => {
265
+ if (i < 0 || j < 0 ) {
266
+ return 0 ;
267
+ }
268
+ if (i === 0 ) {
269
+ return k === 1 && j <= limit ? 1 : 0 ;
270
+ }
271
+ if (j === 0 ) {
272
+ return k === 0 && i <= limit ? 1 : 0 ;
273
+ }
274
+ let res = f [i ][j ][k ];
275
+ if (res !== - 1 ) {
276
+ return res ;
277
+ }
278
+ if (k === 0 ) {
279
+ res = (dfs (i - 1 , j , 0 ) + dfs (i - 1 , j , 1 ) - dfs (i - limit - 1 , j , 1 ) + mod ) % mod ;
280
+ } else {
281
+ res = (dfs (i , j - 1 , 0 ) + dfs (i , j - 1 , 1 ) - dfs (i , j - limit - 1 , 0 ) + mod ) % mod ;
282
+ }
283
+ return (f [i ][j ][k ] = res );
284
+ };
285
+
286
+ return (dfs (zero , one , 0 ) + dfs (zero , one , 1 )) % mod ;
287
+ }
288
+ ```
289
+
262
290
<!-- tabs: end -->
263
291
264
292
<!-- solution: end -->
@@ -295,16 +323,10 @@ class Solution:
295
323
f[0 ][j][1 ] = 1
296
324
for i in range (1 , zero + 1 ):
297
325
for j in range (1 , one + 1 ):
298
- f[i][j][0 ] = (
299
- f[i - 1 ][j][0 ]
300
- + f[i - 1 ][j][1 ]
301
- - (0 if i - limit - 1 < 0 else f[i - limit - 1 ][j][1 ])
302
- ) % mod
303
- f[i][j][1 ] = (
304
- f[i][j - 1 ][0 ]
305
- + f[i][j - 1 ][1 ]
306
- - (0 if j - limit - 1 < 0 else f[i][j - limit - 1 ][0 ])
307
- ) % mod
326
+ x = 0 if i - limit - 1 < 0 else f[i - limit - 1 ][j][1 ]
327
+ y = 0 if j - limit - 1 < 0 else f[i][j - limit - 1 ][0 ]
328
+ f[i][j][0 ] = (f[i - 1 ][j][0 ] + f[i - 1 ][j][1 ] - x) % mod
329
+ f[i][j][1 ] = (f[i][j - 1 ][0 ] + f[i][j - 1 ][1 ] - y) % mod
308
330
return sum (f[zero][one]) % mod
309
331
```
310
332
@@ -323,12 +345,10 @@ class Solution {
323
345
}
324
346
for (int i = 1 ; i <= zero; ++ i) {
325
347
for (int j = 1 ; j <= one; ++ j) {
326
- f[i][j][0 ] = (f[i - 1 ][j][0 ] + f[i - 1 ][j][1 ]
327
- - (i - limit - 1 < 0 ? 0 : f[i - limit - 1 ][j][1 ]) + mod)
328
- % mod;
329
- f[i][j][1 ] = (f[i][j - 1 ][0 ] + f[i][j - 1 ][1 ]
330
- - (j - limit - 1 < 0 ? 0 : f[i][j - limit - 1 ][0 ]) + mod)
331
- % mod;
348
+ long x = i - limit - 1 < 0 ? 0 : f[i - limit - 1 ][j][1 ];
349
+ long y = j - limit - 1 < 0 ? 0 : f[i][j - limit - 1 ][0 ];
350
+ f[i][j][0 ] = (f[i - 1 ][j][0 ] + f[i - 1 ][j][1 ] - x + mod) % mod;
351
+ f[i][j][1 ] = (f[i][j - 1 ][0 ] + f[i][j - 1 ][1 ] - y + mod) % mod;
332
352
}
333
353
}
334
354
return (int ) ((f[zero][one][0 ] + f[zero][one][1 ]) % mod);
@@ -354,12 +374,10 @@ public:
354
374
}
355
375
for (int i = 1; i <= zero; ++i) {
356
376
for (int j = 1; j <= one; ++j) {
357
- f[ i] [ j ] [ 0] = (f[ i - 1] [ j ] [ 0] + f[ i - 1] [ j ] [ 1]
358
- - (i - limit - 1 < 0 ? 0 : f[ i - limit - 1] [ j ] [ 1] ) + mod)
359
- % mod;
360
- f[ i] [ j ] [ 1] = (f[ i] [ j - 1 ] [ 0] + f[ i] [ j - 1 ] [ 1]
361
- - (j - limit - 1 < 0 ? 0 : f[ i] [ j - limit - 1 ] [ 0] ) + mod)
362
- % mod;
377
+ ll x = i - limit - 1 < 0 ? 0 : f[ i - limit - 1] [ j ] [ 1] ;
378
+ ll y = j - limit - 1 < 0 ? 0 : f[ i] [ j - limit - 1 ] [ 0] ;
379
+ f[ i] [ j ] [ 0] = (f[ i - 1] [ j ] [ 0] + f[ i - 1] [ j ] [ 1] - x + mod) % mod;
380
+ f[ i] [ j ] [ 1] = (f[ i] [ j - 1 ] [ 0] + f[ i] [ j - 1 ] [ 1] - y + mod) % mod;
363
381
}
364
382
}
365
383
return (f[ zero] [ one ] [ 0] + f[ zero] [ one ] [ 1] ) % mod;
@@ -398,6 +416,35 @@ func numberOfStableArrays(zero int, one int, limit int) int {
398
416
}
399
417
```
400
418
419
+ #### TypeScript
420
+
421
+ ``` ts
422
+ function numberOfStableArrays(zero : number , one : number , limit : number ): number {
423
+ const mod = 1e9 + 7 ;
424
+ const f: number [][][] = Array .from ({ length: zero + 1 }, () =>
425
+ Array .from ({ length: one + 1 }, () => [0 , 0 ]),
426
+ );
427
+
428
+ for (let i = 1 ; i <= Math .min (limit , zero ); i ++ ) {
429
+ f [i ][0 ][0 ] = 1 ;
430
+ }
431
+ for (let j = 1 ; j <= Math .min (limit , one ); j ++ ) {
432
+ f [0 ][j ][1 ] = 1 ;
433
+ }
434
+
435
+ for (let i = 1 ; i <= zero ; i ++ ) {
436
+ for (let j = 1 ; j <= one ; j ++ ) {
437
+ const x = i - limit - 1 < 0 ? 0 : f [i - limit - 1 ][j ][1 ];
438
+ const y = j - limit - 1 < 0 ? 0 : f [i ][j - limit - 1 ][0 ];
439
+ f [i ][j ][0 ] = (f [i - 1 ][j ][0 ] + f [i - 1 ][j ][1 ] - x + mod ) % mod ;
440
+ f [i ][j ][1 ] = (f [i ][j - 1 ][0 ] + f [i ][j - 1 ][1 ] - y + mod ) % mod ;
441
+ }
442
+ }
443
+
444
+ return (f [zero ][one ][0 ] + f [zero ][one ][1 ]) % mod ;
445
+ }
446
+ ```
447
+
401
448
<!-- tabs: end -->
402
449
403
450
<!-- solution: end -->
0 commit comments