คำชี้แจงปัญหา
ให้ตัวเลข N เราต้องหาจำนวนต่ำสุดของพาลินโดรมที่จำเป็นในการแสดง N เป็นผลรวมของพวกมัน
ถ้า N =15 ต้องใช้พาลินโดรม 2 อัน เช่น 8 และ 7
อัลกอริทึม
<ก่อน>1. สร้าง palindromes ทั้งหมดได้ถึง N แบบเรียงลำดับ2 จงหาขนาดของเซตย่อยที่เล็กที่สุดโดยให้ผลรวมของมันคือ Nตัวอย่าง
#include#include #include #include using namespace std;vector > table;int createPalindrome (อินพุต int, bool isOdd) { int n =ป้อนข้อมูล; int palindrome =อินพุต; ถ้า (isOdd) n /=10; ในขณะที่ (n> 0) { palindrome =palindrome * 10 + (n % 10); n /=10; } return palindrome;}vector generatePalindromes(int n){ vector palindromes; จำนวน int; สำหรับ (int j =0; j <2; j++) { int i =1; ในขณะที่ ((หมายเลข =createPalindrome(i++, j)) <=n) palindromes.push_back(number); } return palindromes;}ยาว minSubsetSize(vector &vec, int i, int j, int n){ if (n ==0) return 0; ถ้า (i> j || vec[i]> n) ส่งคืน INT_MAX; ถ้า (table[i][n]) ส่งคืน table[i][n]; ตาราง[i][n] =min(1 + minSubsetSize(vec, i + 1, j, n - vec[i]), minSubsetSize(vec, i + 1, j, n)); ส่งคืนตาราง[i][n];}int requiredPalindromes(int n){ vector palindromes =generatePalindromes(n); การเรียงลำดับ (palindromes.begin(), palindromes.end()); ตาราง =เวกเตอร์<เวกเตอร์<ยาวยาว>>(palindromes.size(), เวกเตอร์<ยาว>(n + 1, 0)); คืนค่า minSubsetSize(palindromes, 0, palindromes.size() - 1, n);}int main(){ int n =15; cout <<"palindromes ขั้นต่ำที่จำเป็น =" < ผลลัพธ์
เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้ -
พาลินโดรมขั้นต่ำที่ต้องการ =2