คำอธิบาย
รับอาร์เรย์ของ N จำนวนเต็มโดยที่ N เป็นจำนวนคู่ อนุญาตให้ดำเนินการได้ 2 ประเภท
- เพิ่มค่าขององค์ประกอบใดๆ ของอาร์เรย์ขึ้น 1
- หากองค์ประกอบที่อยู่ติดกันสององค์ประกอบในอาร์เรย์เป็นจำนวนเฉพาะที่อยู่ติดกัน ให้ลบองค์ประกอบทั้งสองออก
ภารกิจคือการค้นหาจำนวนการดำเนินการขั้นต่ำที่จำเป็นในการลบองค์ประกอบทั้งหมดของอาร์เรย์
ตัวอย่าง
หากอาร์เรย์เป็น {10, 13} จำเป็นต้องมีการดำเนินการขั้นต่ำ 2 รายการ
- เพิ่ม 1 st องค์ประกอบของอาร์เรย์ด้วย 1 ดังนั้นอาร์เรย์ใหม่จึงกลายเป็น {11, 13}
- ลบ 1 st และ 2 nd เนื่องจากทั้งคู่เป็นจำนวนเฉพาะติดต่อกัน
อัลกอริทึม
<ก่อน>1. ในการลบตัวเลข เราต้องแปลงตัวเลขสองตัวเป็นจำนวนเฉพาะสองตัวติดต่อกัน2. สมมติว่า a และ b เป็นจำนวนเฉพาะที่ต่อเนื่องกัน จากนั้นเราใช้ตะแกรงของ Eratosthenes เพื่อคำนวณจำนวนเฉพาะล่วงหน้า แล้วหาจำนวนเฉพาะตัวแรก p ไม่มากกว่า a และตัวแรกมากกว่า p โดยใช้อาร์เรย์ 3 เมื่อคำนวณเสร็จแล้ว ให้ใช้โปรแกรมไดนามิกเพื่อแก้ปัญหาตัวอย่าง
#include#include #include using namespace std;int minimumPrefixReversals (int *a, int n) { string start =""; ปลายทางสตริง ="", t, r; สำหรับ (int i =0; i > qu; คู่<สตริง int> p; qu.push(make_pair(เริ่ม, 0)); ถ้า (เริ่มต้น ==ปลายทาง) { กลับ 0; } ในขณะที่ (!qu.empty()) { p =qu.front(); t =p.ก่อน; qu.pop(); สำหรับ (int j =2; j <=n; j++) { r =t; ย้อนกลับ(r.begin(), r.begin() + j); ถ้า (r ==ปลายทาง) { กลับ p.second + 1; } qu.push(make_pair(r, p.second + 1)); } }}int main() { int a[] ={ 1, 2, 4, 3 }; int n =ขนาดของ(a) / sizeof(a[0]); cout <<"การกลับรายการขั้นต่ำ:" < เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้:
ผลลัพธ์
การกลับตัวขั้นต่ำ:3