24839
24839
<ul class="md-nav__list">
24840
24840
24841
24841
<li class="md-nav__item">
24842
- <a href="#solution-1" class="md-nav__link">
24842
+ <a href="#solution-1-dynamic-programming " class="md-nav__link">
24843
24843
<span class="md-ellipsis">
24844
- Solution 1
24845
- </span>
24846
- </a>
24847
-
24848
- </li>
24849
-
24850
- <li class="md-nav__item">
24851
- <a href="#solution-2" class="md-nav__link">
24852
- <span class="md-ellipsis">
24853
- Solution 2
24844
+ Solution 1: Dynamic Programming
24854
24845
</span>
24855
24846
</a>
24856
24847
@@ -86519,7 +86510,25 @@ <h2 id="description">Description</h2>
86519
86510
<h2 id="solutions">Solutions</h2>
86520
86511
<!-- solution:start -->
86521
86512
86522
- <h3 id="solution-1">Solution 1</h3>
86513
+ <h3 id="solution-1-dynamic-programming">Solution 1: Dynamic Programming</h3>
86514
+ <p>First, we need to understand the problem. The problem is essentially asking us to find the number of ways to tile a <span class="arithmatex">\(2 \times n\)</span> board, where each square on the board can only be covered by one tile.</p>
86515
+ <p>There are two types of tiles: <code>2 x 1</code> and <code>L</code> shapes, and both types of tiles can be rotated. We denote the rotated tiles as <code>1 x 2</code> and <code>L'</code> shapes.</p>
86516
+ <p>We define <span class="arithmatex">\(f[i][j]\)</span> to represent the number of ways to tile the first <span class="arithmatex">\(2 \times i\)</span> board, where <span class="arithmatex">\(j\)</span> represents the state of the last column. The last column has 4 states:</p>
86517
+ <ul>
86518
+ <li>The last column is fully covered, denoted as <span class="arithmatex">\(0\)</span></li>
86519
+ <li>The last column has only the top square covered, denoted as <span class="arithmatex">\(1\)</span></li>
86520
+ <li>The last column has only the bottom square covered, denoted as <span class="arithmatex">\(2\)</span></li>
86521
+ <li>The last column is not covered, denoted as <span class="arithmatex">\(3\)</span></li>
86522
+ </ul>
86523
+ <p>The answer is <span class="arithmatex">\(f[n][0]\)</span>. Initially, <span class="arithmatex">\(f[0][0] = 1\)</span> and the rest <span class="arithmatex">\(f[0][j] = 0\)</span>.</p>
86524
+ <p>We consider tiling up to the <span class="arithmatex">\(i\)</span>-th column and look at the state transition equations:</p>
86525
+ <p>When <span class="arithmatex">\(j = 0\)</span>, the last column is fully covered. It can be transitioned from the previous column's states <span class="arithmatex">\(0, 1, 2, 3\)</span> by placing the corresponding tiles, i.e., <span class="arithmatex">\(f[i-1][0]\)</span> with a <code>1 x 2</code> tile, <span class="arithmatex">\(f[i-1][1]\)</span> with an <code>L'</code> tile, <span class="arithmatex">\(f[i-1][2]\)</span> with an <code>L'</code> tile, or <span class="arithmatex">\(f[i-1][3]\)</span> with two <code>2 x 1</code> tiles. Therefore, <span class="arithmatex">\(f[i][0] = \sum_{j=0}^3 f[i-1][j]\)</span>.</p>
86526
+ <p>When <span class="arithmatex">\(j = 1\)</span>, the last column has only the top square covered. It can be transitioned from the previous column's states <span class="arithmatex">\(2, 3\)</span> by placing a <code>2 x 1</code> tile or an <code>L</code> tile. Therefore, <span class="arithmatex">\(f[i][1] = f[i-1][2] + f[i-1][3]\)</span>.</p>
86527
+ <p>When <span class="arithmatex">\(j = 2\)</span>, the last column has only the bottom square covered. It can be transitioned from the previous column's states <span class="arithmatex">\(1, 3\)</span> by placing a <code>2 x 1</code> tile or an <code>L'</code> tile. Therefore, <span class="arithmatex">\(f[i][2] = f[i-1][1] + f[i-1][3]\)</span>.</p>
86528
+ <p>When <span class="arithmatex">\(j = 3\)</span>, the last column is not covered. It can be transitioned from the previous column's state <span class="arithmatex">\(0\)</span>. Therefore, <span class="arithmatex">\(f[i][3] = f[i-1][0]\)</span>.</p>
86529
+ <p>We can see that the state transition equations only involve the previous column's states, so we can use a rolling array to optimize the space complexity.</p>
86530
+ <p>Note that the values of the states can be very large, so we need to take modulo <span class="arithmatex">\(10^9 + 7\)</span>.</p>
86531
+ <p>The time complexity is <span class="arithmatex">\(O(n)\)</span>, and the space complexity is <span class="arithmatex">\(O(1)\)</span>. Where <span class="arithmatex">\(n\)</span> is the number of columns of the board.</p>
86523
86532
<div class="tabbed-set tabbed-alternate" data-tabs="1:4"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label></div>
86524
86533
<div class="tabbed-content">
86525
86534
<div class="tabbed-block">
@@ -86534,42 +86543,18 @@ <h3 id="solution-1">Solution 1</h3>
86534
86543
<span class="normal"> 9</span>
86535
86544
<span class="normal">10</span>
86536
86545
<span class="normal">11</span>
86537
- <span class="normal">12</span>
86538
- <span class="normal">13</span>
86539
- <span class="normal">14</span>
86540
- <span class="normal">15</span>
86541
- <span class="normal">16</span>
86542
- <span class="normal">17</span>
86543
- <span class="normal">18</span>
86544
- <span class="normal">19</span>
86545
- <span class="normal">20</span>
86546
- <span class="normal">21</span>
86547
- <span class="normal">22</span>
86548
- <span class="normal">23</span>
86549
- <span class="normal">24</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Solution</span><span class="p">:</span>
86546
+ <span class="normal">12</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Solution</span><span class="p">:</span>
86550
86547
<span class="k">def</span><span class="w"> </span><span class="nf">numTilings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
86551
- <span class="nd">@cache</span>
86552
- <span class="k">def</span><span class="w"> </span><span class="nf">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
86553
- <span class="k">if</span> <span class="n">i</span> <span class="o">></span> <span class="n">n</span> <span class="ow">or</span> <span class="n">j</span> <span class="o">></span> <span class="n">n</span><span class="p">:</span>
86554
- <span class="k">return</span> <span class="mi">0</span>
86555
- <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">j</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span>
86556
- <span class="k">return</span> <span class="mi">1</span>
86557
- <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span>
86558
- <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">j</span><span class="p">:</span>
86559
- <span class="n">ans</span> <span class="o">=</span> <span class="p">(</span>
86560
- <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
86561
- <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
86562
- <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
86563
- <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
86564
- <span class="p">)</span>
86565
- <span class="k">elif</span> <span class="n">i</span> <span class="o">></span> <span class="n">j</span><span class="p">:</span>
86566
- <span class="n">ans</span> <span class="o">=</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
86567
- <span class="k">else</span><span class="p">:</span>
86568
- <span class="n">ans</span> <span class="o">=</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
86569
- <span class="k">return</span> <span class="n">ans</span> <span class="o">%</span> <span class="n">mod</span>
86570
-
86548
+ <span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
86571
86549
<span class="n">mod</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="mi">9</span> <span class="o">+</span> <span class="mi">7</span>
86572
- <span class="k">return</span> <span class="n">dfs</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
86550
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
86551
+ <span class="n">g</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">4</span>
86552
+ <span class="n">g</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">%</span> <span class="n">mod</span>
86553
+ <span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">%</span> <span class="n">mod</span>
86554
+ <span class="n">g</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">%</span> <span class="n">mod</span>
86555
+ <span class="n">g</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
86556
+ <span class="n">f</span> <span class="o">=</span> <span class="n">g</span>
86557
+ <span class="k">return</span> <span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
86573
86558
</code></pre></div></td></tr></table></div>
86574
86559
</div>
86575
86560
<div class="tabbed-block">
@@ -86674,41 +86659,6 @@ <h3 id="solution-1">Solution 1</h3>
86674
86659
</div>
86675
86660
<!-- solution:end -->
86676
86661
86677
- <!-- solution:start -->
86678
-
86679
- <h3 id="solution-2">Solution 2</h3>
86680
- <div class="tabbed-set tabbed-alternate" data-tabs="2:1"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python3</label></div>
86681
- <div class="tabbed-content">
86682
- <div class="tabbed-block">
86683
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
86684
- <span class="normal"> 2</span>
86685
- <span class="normal"> 3</span>
86686
- <span class="normal"> 4</span>
86687
- <span class="normal"> 5</span>
86688
- <span class="normal"> 6</span>
86689
- <span class="normal"> 7</span>
86690
- <span class="normal"> 8</span>
86691
- <span class="normal"> 9</span>
86692
- <span class="normal">10</span>
86693
- <span class="normal">11</span>
86694
- <span class="normal">12</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Solution</span><span class="p">:</span>
86695
- <span class="k">def</span><span class="w"> </span><span class="nf">numTilings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
86696
- <span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
86697
- <span class="n">mod</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="mi">9</span> <span class="o">+</span> <span class="mi">7</span>
86698
- <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
86699
- <span class="n">g</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">4</span>
86700
- <span class="n">g</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">%</span> <span class="n">mod</span>
86701
- <span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">%</span> <span class="n">mod</span>
86702
- <span class="n">g</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">f</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">%</span> <span class="n">mod</span>
86703
- <span class="n">g</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
86704
- <span class="n">f</span> <span class="o">=</span> <span class="n">g</span>
86705
- <span class="k">return</span> <span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
86706
- </code></pre></div></td></tr></table></div>
86707
- </div>
86708
- </div>
86709
- </div>
86710
- <!-- solution:end -->
86711
-
86712
86662
<!-- problem:end -->
86713
86663
86714
86664
0 commit comments