Color N boxes using M colors such that K boxes have different color from the box on its left - GeeksforGeeks

05 Nov, 2021
Given N number of boxes arranged in a row and M number of colors. The task is to find the number of ways to paint those N boxes using M colors such that there are exactly K boxes with a color different from the color of the box on its left. Print this answer modulo 998244353.Examples:  
Input: N = 3, M = 3, K = 0 Output: 3 Since the value of K is zero, no box can have a different color from color of the box on its left. Thus, all boxes should be painted with same color and since there are 3 types of colors, so there are total 3 ways. Input: N = 3, M = 2, K = 1 Output: 4 Let’s number the colors as 1 and 2. Four possible sequences of painting 3 boxes with 1 box having different color from color of box on its left are (1 2 2), (1 1 2), (2 1 1) (2 2 1)  
Prerequisites : Dynamic Programming 
Approach: This problem can be solved using dynamic programming where dp[i][j] will denote the number of ways to paint i boxes using M colors such that there are exactly j boxes with a color different from the color of the box on its left. For every current box except 1st, either we can paint the same color as painted on its left box and solve for dp[i – 1][j] or we can paint it with remaining M – 1 color and solve for dp[i – 1][j – 1] recursively.Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// CPP Program to Paint N boxes using M// colors such that K boxes have color// different from color of box on its left#include <bits/stdc++.h>using namespace std; const int MOD = 998244353; vector<vector<int>> dp; // This function returns the required number// of ways where idx is the current index and// diff is number of boxes having different// color from box on its leftint solve(int idx, int diff, int N, int M, int K){    // Base Case    if (idx > N) {        if (diff == K)            return 1;        return 0;    }     // If already computed    if (dp[idx][ diff] != -1)        return dp[idx][ diff];     // Either paint with same color as    // previous one    int ans = solve(idx + 1, diff, N, M, K);     // Or paint with remaining (M - 1)    // colors    ans = ans % MOD + ((M - 1) % MOD * solve(idx + 1, diff + 1, N, M, K) % MOD) % MOD;     return dp[idx][ diff] = ans;} // Driver codeint main(){    int N = 3, M = 3, K = 0;    dp = vector<vector<int>>(N+1,vector<int>(N+1,-1));     // Multiply M since first box can be    // painted with any of the M colors and    // start solving from 2nd box    cout << (M * solve(2, 0, N, M, K)) << endl;     return 0;}
// Java Program to Paint N boxes using M// colors such that K boxes have color// different from color of box on its left class GFG{         static int M = 1001;    static int MOD = 998244353;     static int[][] dp = new int[M][M];     // This function returns the required number    // of ways where idx is the current index and    // diff is number of boxes having different    // color from box on its left    static int solve(int idx, int diff,                        int N, int M, int K)    {        // Base Case        if (idx > N)        {            if (diff == K)                return 1;            return 0;        }         // If already computed        if (dp[idx][ diff] != -1)            return dp[idx][ diff];         // Either paint with same color as        // previous one        int ans = solve(idx + 1, diff, N, M, K);         // Or paint with remaining (M - 1)        // colors        ans += (M - 1) * solve(idx + 1,                diff + 1, N, M, K);         return dp[idx][ diff] = ans % MOD;    }     // Driver code    public static void main (String[] args)    {        int N = 3, M = 3, K = 0;        for(int i = 0; i <= M; i++)            for(int j = 0; j <= M; j++)                dp[i][j] = -1;             // Multiply M since first box can be        // painted with any of the M colors and        // start solving from 2nd box        System.out.println((M * solve(2, 0, N, M, K)));    }} // This code is contributed by mits
# Python3 Program to Paint N boxes using M# colors such that K boxes have color# different from color of box on its left M = 1001;MOD = 998244353; dp = [[-1]* M ] * M # This function returns the required number# of ways where idx is the current index and# diff is number of boxes having different# color from box on its leftdef solve(idx, diff, N, M, K) :         # Base Case    if (idx > N) :        if (diff == K) :            return 1        return 0     # If already computed    if (dp[idx][ diff] != -1) :        return dp[idx];     # Either paint with same color as    # previous one    ans = solve(idx + 1, diff, N, M, K);     # Or paint with remaining (M - 1)    # colors    ans += (M - 1) * solve(idx + 1, diff + 1, N, M, K);     dp[idx][ diff] = ans % MOD;         return dp[idx][ diff] # Driver codeif __name__ == "__main__" :     N = 3    M = 3    K = 0     # Multiply M since first box can be    # painted with any of the M colors and    # start solving from 2nd box    print(M * solve(2, 0, N, M, K)) # This code is contributed by Ryuga
// C# Program to Paint N boxes using M// colors such that K boxes have color// different from color of box on its leftusing System;class GFG{     static int M = 1001;static int MOD = 998244353; static int[,] dp = new int[M, M]; // This function returns the required number// of ways where idx is the current index and// diff is number of boxes having different// color from box on its leftstatic int solve(int idx, int diff,                 int N, int M, int K){    // Base Case    if (idx > N)    {        if (diff == K)            return 1;        return 0;    }     // If already computed    if (dp[idx, diff] != -1)        return dp[idx, diff];     // Either paint with same color as    // previous one    int ans = solve(idx + 1, diff, N, M, K);     // Or paint with remaining (M - 1)    // colors    ans += (M - 1) * solve(idx + 1,                diff + 1, N, M, K);     return dp[idx, diff] = ans % MOD;} // Driver codepublic static void Main (){    int N = 3, M = 3, K = 0;    for(int i = 0; i <= M; i++)        for(int j = 0; j <= M; j++)            dp[i, j] = -1;     // Multiply M since first box can be    // painted with any of the M colors and    // start solving from 2nd box    Console.WriteLine((M * solve(2, 0, N, M, K)));}} // This code is contributed by chandan_jnu
<?php// PHP Program to Paint N boxes using M// colors such that K boxes have color// different from color of box on its left $M = 1001;$MOD = 998244353; $dp = array_fill(0, $M,      array_fill(0, $M, -1)); // This function returns the required number// of ways where idx is the current index// and diff is number of boxes having// different color from box on its leftfunction solve($idx, $diff, $N, $M, $K){    global $dp, $MOD;         // Base Case    if ($idx > $N)    {        if ($diff == $K)            return 1;        return 0;    }     // If already computed    if ($dp[$idx][$diff] != -1)        return $dp[$idx][$diff];     // Either paint with same color    // as previous one    $ans = solve($idx + 1, $diff, $N, $M, $K);     // Or paint with remaining (M - 1)    // colors    $ans += ($M - 1) * solve($idx + 1,             $diff + 1, $N, $M, $K);     return $dp[$idx][$diff] = $ans % $MOD;} // Driver code$N = 3;$M = 3;$K = 0; // Multiply M since first box can be// painted with any of the M colors and// start solving from 2nd boxecho ($M * solve(2, 0, $N, $M, $K)); // This code is contributed by chandan_jnu?>
<script>     // JavaScript Program to Paint N boxes using M    // colors such that K boxes have color    // different from color of box on its left         let m = 1001;    let MOD = 998244353;       let dp = new Array(m);    for(let i = 0; i < m; i++)    {        dp[i] = new Array(m);        for(let j = 0; j < m; j++)        {            dp[i][j] = 0;        }    }       // This function returns the required number    // of ways where idx is the current index and    // diff is number of boxes having different    // color from box on its left    function solve(idx, diff, N, M, K)    {        // Base Case        if (idx > N)        {            if (diff == K)                return 1;            return 0;        }           // If already computed        if (dp[idx][ diff] != -1)            return dp[idx][ diff];           // Either paint with same color as        // previous one        let ans = solve(idx + 1, diff, N, M, K);           // Or paint with remaining (M - 1)        // colors        ans += (M - 1) * solve(idx + 1,                diff + 1, N, M, K);          dp[idx][ diff] = ans % MOD;        return dp[idx][ diff];    }         let N = 3, M = 3, K = 0;    for(let i = 0; i <= M; i++)      for(let j = 0; j <= M; j++)        dp[i][j] = -1;     // Multiply M since first box can be    // painted with any of the M colors and    // start solving from 2nd box    document.write((M * solve(2, 0, N, M, K)));     </script>
3
 
Time Complexity: O(M*M)Auxiliary Space: O(M*M)
ankthon
Mithun Kumar
Chandan_Kumar
mukesh07
pankajsharmagfg
ashutoshsinghgeeksforgeeks
Technical Scripter 2018
Algorithms
Competitive Programming
Dynamic Programming
Mathematical
Dynamic Programming
Mathematical
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Introduction to Algorithms
Playfair Cipher with Examples
How to write a Pseudo Code?
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Competitive Programming - A Complete Guide
Modulo 10^9+7 (1000000007)
Top 10 Algorithms and Data Structures for Competitive Programming