Count of arrays having consecutive element with different values in C++

C++Server Side ProgrammingProgramming

Given three variables size, max_val, last_element as input. The goal is to find the count of different arrays that can be formed in a manner such that they have size elements, have elements between 1 and max_val and the first element is always 1 and the last element is always max_val. Also make sure that no two consecutive elements are the same.

Let us understand with examples.

For Example

Input - size = 5, max_val = 3, last_element = 3

Output - Count of arrays having consecutive element with different values are: 5

Explanation - The arrays will be:-

[ 1, 2, 3, 1, 3 ], [ 1, 2, 3, 2, 3 ], [ 1, 2, 1, 2, 3 ], [ 1, 3, 1, 2, 3 ], [ 1, 3, 2, 1, 3 ].

Input -  size = 3  max_val = 2   last_element = 2

Output - Count of arrays having consecutive element with different values are: 0

Explanation - No array possible with 3 elements and having [ 1, _, 2 ] as consecutive elements as we cannot fill anything except 1 or 2 for the middle element and this will violate consecutive different elements' condition.

Approach used in the below program is as follows

  • In this approach we will use dynamic programming and combinatorics for finding such arrays count. 
  • The first and last elements will be fixed as 1 and last_element. For any size of arrays the ways to fill it will be for size-2 elements only.
  • For filling [1 to max_val] elements to be filled in size-2 places. Ways will be ways(max_val)= ways(size) / (max_val - 1) 
  • For each range 1 to i, ways will be ways(i)=ways(size) / (max_val - 1) [  ways(size) = number of ways last element can be filled with numbers 2 to max_val ).
  • If last_element is 1 then ways will be ways(size-1) as last element can only be 1.
  • The second last element can always be between 1 and max_val.
  • If second last element is not 1 then ways will be (max_val-2)*ways(i-1) as arri </sub>cannot be 1 or arri-1
  • If second last element is 1 then ways will be (max_val-1)*ways(i-1) as arri-1 is 1 and arri-2 is not 1.
  • Ways(i) will be :- (max_val - 2)*ways(i-2) + (max_val-2)*ways(i-1)
  • Take variables size, max_val and last_element as input.
  • Function diff_val(int size, int max_val, int last_element) takes all inputs and returns the count of arrays having consecutive elements with different values.
  • Take the initial count as 0.
  • Take array arr[Max_N] = { 0 } storing count of ways to fill arrays. Initialize arr[0] with 0 and arr[1] with 1.
  • Traverse from i=2 to i<size.
  • Take temp_1 = (max_val - 2) * arr[i - 1] and temp_2 = (max_val - 1) * arr[i - 2]
  • Set  arr[i] = temp_1 + temp_2.
  • In case last_element == 1 then set count = (max_val - 1) * arr[size - 2].
  • Otherwise return arr[size - 1].
  • At the end return count as result.

Example

Live Demo

#include <bits/stdc++.h>
using namespace std;
#define Max_N 109

int diff_val(int size, int max_val, int last_element) {
   int count = 0;
   int arr[Max_N] = {
      0
   };
   arr[0] = 0;
   arr[1] = 1;
   for (int i = 2; i < size; i++) {
      int temp_1 = (max_val - 2) * arr[i - 1];
      int temp_2 = (max_val - 1) * arr[i - 2];
      arr[i] = temp_1 + temp_2;
   }
   if (last_element == 1) {
      count = (max_val - 1) * arr[size - 2];
   } else {
      return arr[size - 1];
   }
   return count;
}
int main() {
   int size = 5;
   int max_val = 3;
   int last_element = 3;
   cout << "Count of arrays having consecutive element with different values are: " << diff_val(size, max_val, last_element);
   return 0;
}

If we run the above code it will generate the following output −

Output

Count of arrays having consecutive element with different values are: 5
raja
Published on 29-Jan-2021 08:34:46
Advertisements