Number of Ways to Paint N × 3 Grid

Hard
Watch on YouTube ↗

Solution

/* Recursive Solution With Memoization */
class Solution {
    long MOD = 1_000_000_007L;
    Long dp[][];
    public int numOfWays(int n) {
        dp = new Long[n][2];
        long result =(6L*ways(1, n, 0))%MOD + (6L*ways(1, n , 1))%MOD;
        return (int)(result%MOD);
    }

    long ways(int row, int n, int type) {
        // base case
        if(row==n) {
            return 1L;
        }
        if(dp[row][type]!=null) {
            return dp[row][type];
        }
        long ans = 0;
        if(type==0) {
            ans = (2L*ways(row+1, n, type))%MOD + (2L*ways(row+1, n, 1))%MOD;
        }
        else if(type==1) {
            ans =  (2L*ways(row+1, n, 0))%MOD + (3L*ways(row+1, n, type))%MOD;
        }
        dp[row][type] = ans%MOD;
        return dp[row][type];
    }
}

/* Iterative Solution */
class Solution {
    long MOD = 1_000_000_007L;
    long dp[][];
    public int numOfWays(int n) {
        dp = new long[n][2];
        dp[0][0] = 6;
        dp[0][1] = 6;
        for(int i=1; i<n; i++) {
            dp[i][0] = (2*dp[i-1][0] + 2*dp[i-1][1])%MOD;
            dp[i][1] = (2*dp[i-1][0] + 3*dp[i-1][1])%MOD;
        }
        return (int)((dp[n-1][0] + dp[n-1][1])%MOD);
        
    }

}