Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จำนวนอาร์เรย์ที่มีองค์ประกอบต่อเนื่องกันโดยมีค่าต่างกันใน C++


กำหนดขนาดตัวแปรสามตัว max_val, last_element เป็นอินพุต เป้าหมายคือการหาจำนวนอาร์เรย์ต่างๆ ที่สามารถสร้างขึ้นในลักษณะที่มีองค์ประกอบขนาด มีองค์ประกอบระหว่าง 1 ถึง max_val และองค์ประกอบแรกจะเป็น 1 เสมอ และองค์ประกอบสุดท้ายจะเป็น max_val เสมอ ตรวจสอบให้แน่ใจด้วยว่าไม่มีองค์ประกอบที่ต่อเนื่องกันสององค์ประกอบที่เหมือนกัน

ให้เราเข้าใจด้วยตัวอย่าง

ตัวอย่าง

ป้อนข้อมูล - ขนาด =5, max_val =3, last_element =3

ผลลัพธ์ - จำนวนอาร์เรย์ที่มีองค์ประกอบต่อเนื่องกันที่มีค่าต่างกันคือ 5

คำอธิบาย - อาร์เรย์จะเป็น:-

[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 ].

ป้อนข้อมูล - ขนาด =3 max_val =2 สุดท้าย_องค์ประกอบ =2

ผลลัพธ์ - จำนวนอาร์เรย์ที่มีองค์ประกอบต่อเนื่องกันที่มีค่าต่างกันคือ 0

คำอธิบาย - ไม่มีอาร์เรย์ที่เป็นไปได้ที่มี 3 องค์ประกอบและมี [ 1, _, 2 ] เป็นองค์ประกอบที่ต่อเนื่องกัน เนื่องจากเราไม่สามารถเติมอะไรก็ได้ยกเว้น 1 หรือ 2 สำหรับองค์ประกอบตรงกลาง และจะละเมิดเงื่อนไขขององค์ประกอบที่แตกต่างกันที่ต่อเนื่องกัน

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

  • ในแนวทางนี้ เราจะใช้ไดนามิกการเขียนโปรแกรมและ combinatorics ในการค้นหาจำนวนอาร์เรย์ดังกล่าว
  • องค์ประกอบแรกและองค์ประกอบสุดท้ายจะได้รับการแก้ไขเป็น 1 และองค์ประกอบสุดท้าย_ สำหรับอาร์เรย์ทุกขนาด วิธีการเติมจะใช้ได้สำหรับองค์ประกอบขนาด-2 เท่านั้น
  • สำหรับการเติม [1 ถึง max_val] องค์ประกอบที่จะเติมในขนาด-2 ตำแหน่ง Ways จะเป็น way(max_val)=ways(size) / (max_val - 1)
  • สำหรับแต่ละช่วง 1 ถึง i วิธีจะเป็น ways(i)=ways(size) / (max_val - 1) [ ways(size) =จำนวนวิธีเติมองค์ประกอบสุดท้ายด้วยตัวเลข 2 ถึง max_val )
  • หากlast_element เป็น 1 ทางจะเป็น way(size-1) เนื่องจากองค์ประกอบสุดท้ายสามารถเป็น 1 ได้เท่านั้น
  • องค์ประกอบสุดท้ายที่สองสามารถอยู่ระหว่าง 1 ถึง max_val เสมอ
  • หากองค์ประกอบสุดท้ายที่สองไม่ใช่ 1 วิธีจะเป็น (max_val-2)*ways(i-1) เนื่องจาก arri ไม่สามารถเป็น 1 หรือ arri-1
  • หากองค์ประกอบสุดท้ายที่สองคือ 1 วิธีจะเป็น (max_val-1)*ways(i-1) เป็น arri-1 คือ 1 และ arri-2 ไม่ใช่ 1.
  • วิธี(i) จะเป็น :- (max_val - 2)*ways(i-2) + (max_val-2)*ways(i-1)
  • นำขนาดตัวแปร max_val และ last_element เป็นอินพุต
  • ฟังก์ชัน diff_val(ขนาด int, int max_val, int last_element) รับอินพุตทั้งหมดและส่งกลับจำนวนอาร์เรย์ที่มีองค์ประกอบต่อเนื่องกันที่มีค่าต่างกัน
  • นับเริ่มต้นเป็น 0
  • ใช้อาร์เรย์ arr[Max_N] ={ 0 } การจัดเก็บจำนวนวิธีในการเติมอาร์เรย์ เริ่มต้น arr[0] ด้วย 0 และ arr[1] ด้วย 1.
  • เปลี่ยนเส้นทางจาก i=2 ไปยัง i<ขนาด
  • ใช้ temp_1 =(max_val - 2) * arr[i - 1] และ temp_2 =(max_val - 1) * arr[i - 2]
  • ตั้งค่า arr[i] =temp_1 + temp_2.
  • ในกรณีที่ last_element ==1 ให้ตั้งค่า count =(max_val - 1) * arr[size - 2]
  • มิฉะนั้น return arr[size - 1].
  • เมื่อสิ้นสุดการส่งคืน นับเป็นผลลัพธ์

ตัวอย่าง

#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;
}

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

ผลลัพธ์

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