Advertisement
Fastrail08

Tiling Problem M * N Board with M * 1 tile

May 31st, 2025
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. /*
  5. QUESTION - https://www.youtube.com/watch?v=_c_R-uIi-zU&list=PL-Jc9J83PIiG8fE6rj9F5a6uyQ5WPdqKy&index=27
  6. Tiling m * N board with m * 1 tiles
  7. */
  8.  
  9. long long getWaysToTilemXN(int N, int &m, vector<long long> &memo){
  10.     //base case
  11.     if(N < m){
  12.         // 1 way to tile, place vertically only, as you can't place horizontally, tile length(m) > board length(N)
  13.         return 1;
  14.     }
  15.     if(N == m){
  16.         // 2 ways to tile (place all horizontally or all vertically)
  17.         return 2;
  18.     }
  19.     if(memo[N] != -1){
  20.         return memo[N];
  21.     }
  22.     long long placedVertically = 0, placedHorizontally = 0;
  23.     //place tile as m * 1 (vertically)
  24.     placedVertically = 1 * getWaysToTilemXN(N - 1, m, memo);
  25.     //place tile as 1 * m (horizontally)
  26.     if(N >= m){
  27.         placedHorizontally = 1 * getWaysToTilemXN(N - m, m, memo);
  28.     }
  29.     return memo[N] = placedVertically + placedHorizontally;
  30. }
  31.  
  32. long long getWaysToTilemXNDP(int N, int m){
  33.     if(N < m){
  34.         //can only place vertically
  35.         return 1;
  36.     }
  37.     // Storage & Meaning - dp[i] = ways to tile m * i board
  38.     vector<long long> dp(N + 1, -1);
  39.    
  40.     /*Direction -
  41.     Smallest Problem:
  42.     dp[0] = dp[1] = dp[2] = dp[3] = dp[4] = ..... dp[i] = 1; i < M
  43.     dp[i] = 2; i == M
  44.     Largest Problem = dp[N]
  45.     */
  46.     for(int i = 0; i < m; i++){
  47.         dp[i] = 1;
  48.     }
  49.     dp[m] = 2;
  50.    
  51.     // Travel & Solve - Travel from Smallest to Largest Problem.
  52.     for(int i = m + 1; i <= N; i++){
  53.         dp[i] = dp[i - 1] + dp[i - m];
  54.     }
  55.     return dp[N];
  56. }
  57.  
  58. int main() {
  59.     // your code goes here
  60.     int N, m;
  61.     cin >> N >> m;
  62.     vector<long long> memo(N + 1, - 1);
  63.     cout << getWaysToTilemXN(N, m, memo) << '\n';
  64.     cout << getWaysToTilemXNDP(N, m) << '\n';
  65. }
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement