C++ 中相邻元素差值之和的最大值
c++server side programmingprogramming
在这个问题中,给定一个数字 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
我们利用 S(N) 和 maxSum(N) 来计算 F(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)。N 每增加一个值,F(N) 的值就会增加,当 N 为 2 和 3 时,F(N) 的值最初为 0。
这使得 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
使用此公式,我们可以找到任意给定 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