ในปัญหานี้ เราได้รับตัวเลข N หน้าที่ของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมสูงสุดของความแตกต่างขององค์ประกอบที่อยู่ติดกันใน C++
คำอธิบายปัญหา
เราจะหาผลรวมสูงสุดของผลต่างสัมบูรณ์ระหว่างองค์ประกอบที่อยู่ติดกันของอาร์เรย์การเรียงสับเปลี่ยนทั้งหมด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
N = 4
ผลลัพธ์
7
คำอธิบาย
All permutations of size 4 are :
{1, 2, 3, 4} = 1 + 1 + 1 = 3
{1, 2, 4, 3} = 1 + 2 + 1 = 4
{1, 3, 2, 4} = 2 + 1 + 2 = 5
{1, 3, 4, 2} = 2 + 1 + 2 = 5
{1, 4, 2, 3} = 3 + 2 + 1 = 6
{1, 4, 3, 2} = 3 + 1 + 1 = 5
{2, 1, 3, 4} = 1 + 2 + 1 = 4
{2, 1, 4, 3} = 1 + 3 + 1 = 5
{2, 3, 1, 4} = 1 + 2 + 3 = 6
{2, 3, 4, 1} = 1 + 1 + 3 = 5
{2, 4, 1, 3} = 2 + 3 + 2 = 7
{2, 4, 3, 1} = 2 + 1 + 2 = 5
{3, 1, 2, 4} = 2 + 1 + 2 = 5
{3, 1, 4, 2} = 2 + 3 + 2 = 7
{3, 2, 1, 4} = 1 + 1 + 3 = 5
{3, 2, 4, 1} = 1 + 2 + 3 = 6
{3, 4, 1, 2} = 1 + 3 + 1 = 5
{3, 4, 2, 1} = 1 + 2 + 1 = 4
{4, 1, 2, 3} = 3 + 1 + 1 = 5
{4, 1, 3, 2} = 3 + 2 + 1 = 6
{4, 2, 1, 3} = 2 + 1 + 2 = 5
{4, 2, 3, 1} = 2 + 1 + 2 = 5
{4, 3, 1, 2} = 1 + 2 + 1 = 4
{4, 3, 2, 1} = 1 + 1 + 1 = 3 แนวทางการแก้ปัญหา
ในการแก้ปัญหาประเภทนี้ เราต้องหาผลรวมทั่วไปของการเรียงสับเปลี่ยน
นี่คือค่าบางส่วนของผลรวมสูงสุดของผลต่างขององค์ประกอบที่อยู่ติดกันสำหรับค่าต่างๆ ของ N
N = 2, maxSum = 1 N = 3, maxSum = 3 N = 4, maxSum = 7 N = 5, maxSum = 11 N = 6, maxSum = 17 N = 7, maxSum = 23 N = 8, maxSum = 31
ผลรวมนี้ดูเหมือนการบวกขึ้นอยู่กับ N + ผลรวมของเงื่อนไข N
maxSum =S(N) + F(N) S(N) =n(n-1)/2 และ F(N) เป็นฟังก์ชันที่ไม่รู้จักของ N
หา F(N) โดยใช้ S(N), maxSum(N)
F(2) = 0 F(3) = 0 F(4) = 1 F(5) = 1 F(6) = 2 F(7) = 2 F(8) = 3
จากตรงนี้ เราสามารถสรุปได้ว่า F(N) คือ Int(N/2 - 1) F(N) เพิ่มขึ้นทุก ๆ วินาทีของค่า N และเริ่มต้นสำหรับ 2 และ 3 เป็นศูนย์
นี่ทำให้สูตรสำหรับ maxSum
maxSum = N(N-1)/2 + N/2 - 1 maxSum = N(N-1)/2 + N/2 - 2/2 maxSum = ( N(N-1) + N - 2 )/2 maxSum = ( (N^2) - N + N - 2 )/2 maxSum = ((N^2) - 2 )/2
เมื่อใช้สูตรนี้ เราสามารถหาค่า maxSum ของค่าที่กำหนดของ N
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream>
using namespace std;
int calcMaxSumofDiff(int N){
int maxSum = 0;
maxSum = ((N*N) - 2) /2 ;
return maxSum;
}
int main(){
int N = 13;
cout<<"The maximum sum of difference of adjacent elements is "<<calcMaxSumofDiff(N);
return 0;
} ผลลัพธ์
The maximum sum of difference of adjacent elements is 83