|
34 | 34 |
|
35 | 35 | =end |
36 | 36 |
|
| 37 | +# Runtime: 200 ms |
| 38 | +# Memory: 211.4 MB |
37 | 39 | # @param {String[]} pizza |
38 | 40 | # @param {Integer} k |
39 | 41 | # @return {Integer} |
40 | 42 | def ways(pizza, k) |
41 | | - rows = pizza.size |
42 | | - cols = pizza[0].size |
43 | | - apples = Array.new(rows + 1) { Array.new(cols + 1, 0) } |
44 | | - f = Array.new(rows) { Array.new(cols, 0) } |
45 | | - |
46 | | - row = rows - 1 |
47 | | - while row >= 0 |
48 | | - col = cols - 1 |
49 | | - while col >= 0 |
50 | | - apples[row][col] = ((pizza[row][col] == "A") && 1 || 0) + apples[row + 1][col] + apples[row][col + 1] - apples[row + 1][col + 1] |
51 | | - f[row][col] = (apples[row][col] > 0) && 1 || 0 |
52 | | - col -= 1 |
| 43 | + r, c = pizza.size, pizza[0].size |
| 44 | + ap = Array.new(r + 1).map { Array.new(c + 1, 0) } |
| 45 | + (0...r).reverse_each do |i| |
| 46 | + (0...c).reverse_each do |j| |
| 47 | + x = ?A == pizza[i][j] ? 1 : 0 |
| 48 | + ap[i][j] = x + ap[i + 1][j] + ap[i][j + 1] - ap[i + 1][j + 1] |
53 | 49 | end |
54 | | - row -= 1 |
55 | 50 | end |
56 | | - |
| 51 | + dp = Array.new(k).map { Array.new(r).map { Array.new(c, 0) } } |
| 52 | + dp[0] = Array.new(r).map.with_index { |_, i| Array.new(c).map.with_index { |_, j| ap[i][j] > 0 ? 1 : 0 } } |
57 | 53 | mod = 1000000007 |
58 | | - remain = 1 |
59 | | - while remain < k |
60 | | - g = Array.new(rows) { Array.new(cols, 0) } |
61 | | - row = 0 |
62 | | - while row < rows |
63 | | - col = 0 |
64 | | - while col < cols |
65 | | - next_row = row + 1 |
66 | | - while next_row < rows |
67 | | - if apples[row][col] - apples[next_row][col] > 0 |
68 | | - g[row][col] += f[next_row][col] %= mod |
69 | | - end |
70 | | - next_row += 1 |
| 54 | + (1...k).each do |rmn| |
| 55 | + (0...r).each do |i| |
| 56 | + (0...c).each do |j| |
| 57 | + val = 0 |
| 58 | + (i + 1...r).each do |ni| |
| 59 | + val += dp[rmn - 1][ni][j] if ap[i][j] - ap[ni][j] > 0 |
71 | 60 | end |
72 | | - |
73 | | - next_col = col + 1 |
74 | | - while next_col < cols |
75 | | - if apples[row][col] - apples[row][next_col] > 0 |
76 | | - g[row][col] += f[row][next_col] %= mod |
77 | | - end |
78 | | - next_col += 1 |
| 61 | + (j + 1...c).each do |nj| |
| 62 | + val += dp[rmn - 1][i][nj] if ap[i][j] - ap[i][nj] > 0 |
79 | 63 | end |
80 | | - col += 1 |
| 64 | + dp[rmn][i][j] = val % mod |
81 | 65 | end |
82 | | - row += 1 |
83 | 66 | end |
84 | | - f = g |
85 | | - remain += 1 |
86 | 67 | end |
87 | | - |
88 | | - f[0][0] |
| 68 | + dp[k - 1][0][0] |
89 | 69 | end |
90 | 70 |
|
91 | 71 | # **************** # |
92 | 72 | # TEST # |
93 | 73 | # **************** # |
94 | 74 |
|
95 | | -# require "test/unit" |
96 | | -# class Test_ways < Test::Unit::TestCase |
97 | | -# def test_ |
98 | | -# assert_equal 3, ways(["A..", "AAA", "..."], 3) |
99 | | -# assert_equal 1, ways(["A..", "AA.", "..."], 3) |
100 | | -# assert_equal 1, ways(["A..", "A..", "..."], 1) |
101 | | -# end |
102 | | -# end |
103 | | - |
104 | | - |
105 | | -pizza = ["..A.A.AAA...AAAAAA.AA..A..A.A......A.AAA.AAAAAA.AA", "A.AA.A.....AA..AA.AA.A....AAA.A........AAAAA.A.AA.", "A..AA.AAA..AAAAAAAA..AA...A..A...A..AAA...AAAA..AA", "....A.A.AA.AA.AA...A.AA.AAA...A....AA.......A..AA.", "AAA....AA.A.A.AAA...A..A....A..AAAA...A.A.A.AAAA..", "....AA..A.AA..A.A...A.A..AAAA..AAAA.A.AA..AAA...AA", "A..A.AA.AA.A.A.AA..A.A..A.A.AAA....AAAAA.A.AA..A.A", ".AA.A...AAAAA.A..A....A...A.AAAA.AA..A.AA.AAAA.AA.", "A.AA.AAAA.....AA..AAA..AAAAAAA...AA.A..A.AAAAA.A..", "A.A...A.A...A..A...A.AAAA.A..A....A..AA.AAA.AA.AA.", ".A.A.A....AAA..AAA...A.AA..AAAAAAA.....AA....A....", "..AAAAAA..A..A...AA.A..A.AA......A.AA....A.A.AAAA.", "...A.AA.AAA.AA....A..AAAA...A..AAA.AAAA.A.....AA.A", "A.AAAAA..A...AAAAAAAA.AAA.....A.AAA.AA.A..A.A.A...", "A.A.AA...A.A.AA...A.AA.AA....AA...AA.A..A.AA....AA", "AA.A..A.AA..AAAAA...A..AAAAA.AA..AA.AA.A..AAAAA..A", "...AA....AAAA.A...AA....AAAAA.A.AAAA.A.AA..AA..AAA", "..AAAA..AA..A.AA.A.A.AA...A...AAAAAAA..A.AAA..AA.A", "AA....AA....AA.A......AAA...A...A.AA.A.AA.A.A.AA.A", "A.AAAA..AA..A..AAA.AAA.A....AAA.....A..A.AA.A.A...", "..AA...AAAAA.A.A......AA...A..AAA.AA..A.A.A.AA..A.", ".......AA..AA.AAA.A....A...A.AA..A.A..AAAAAAA.AA.A", ".A.AAA.AA..A.A.A.A.A.AA...AAAA.A.A.AA..A...A.AAA..", "A..AAAAA.A..A..A.A..AA..A...AAA.AA.A.A.AAA..A.AA..", "A.AAA.A.AAAAA....AA..A.AAA.A..AA...AA..A.A.A.AA.AA", ".A..AAAA.A.A.A.A.......AAAA.AA...AA..AAA..A...A.AA", "A.A.A.A..A...AA..A.AAA..AAAAA.AA.A.A.A..AA.A.A....", "A..A..A.A.AA.A....A...A......A.AA.AAA..A.AA...AA..", ".....A..A...A.A...A..A.AA.A...AA..AAA...AA..A.AAA.", "A...AA..A..AA.A.A.AAA..AA..AAA...AAA..AAA.AAAAA...", "AA...AAA.AAA...AAAA..A...A..A...AA...A..AA.A...A..", "A.AA..AAAA.AA.AAA.A.AA.A..AAAAA.A...A.A...A.AA....", "A.......AA....AA..AAA.AAAAAAA.A.AA..A.A.AA....AA..", ".A.A...AA..AA...AA.AAAA.....A..A..A.AA.A.AA...A.AA", "..AA.AA.AA..A...AA.AA.AAAAAA.....A.AA..AA......A..", "AAA..AA...A....A....AA.AA.AA.A.A.A..AA.AA..AAA.AAA", "..AAA.AAA.A.AA.....AAA.A.AA.AAAAA..AA..AA.........", ".AA..A......A.A.AAA.AAAA...A.AAAA...AAA.AAAA.....A", "AAAAAAA.AA..A....AAAA.A..AA.A....AA.A...A.A....A..", ".A.A.AA..A.AA.....A.A...A.A..A...AAA..A..AA..A.AAA", "AAAA....A...A.AA..AAA..A.AAA..AA.........AA.AAA.A.", "......AAAA..A.AAA.A..AAA...AAAAA...A.AA..A.A.AA.A.", "AA......A.AAAAAAAA..A.AAA...A.A....A.AAA.AA.A.AAA.", ".A.A....A.AAA..A..AA........A.AAAA.AAA.AA....A..AA", ".AA.A...AA.AAA.A....A.A...A........A.AAA......A...", "..AAA....A.A...A.AA..AAA.AAAAA....AAAAA..AA.AAAA..", "..A.AAA.AA..A.AA.A...A.AA....AAA.A.....AAA...A...A", ".AA.AA...A....A.AA.A..A..AAA.A.A.AA.......A.A...A.", "...A...A.AA.A..AAAAA...AA..A.A..AAA.AA...AA...A.A.", "..AAA..A.A..A..A..AA..AA...A..AA.AAAAA.A....A..A.A"] |
106 | | -k = 8 |
107 | | -puts ways(pizza, k) # 641829390 |
| 75 | +require "test/unit" |
| 76 | +class Test_ways < Test::Unit::TestCase |
| 77 | + def test_ |
| 78 | + assert_equal 3, ways(["A..", "AAA", "..."], 3) |
| 79 | + assert_equal 1, ways(["A..", "AA.", "..."], 3) |
| 80 | + assert_equal 1, ways(["A..", "A..", "..."], 1) |
| 81 | + end |
| 82 | +end |
0 commit comments