C++ 中求 2 x n 网格中任意两个元素不相邻的最大和

c++server side programmingprogramming

本题中,给定一个 2 x n 的矩形网格。我们的任务是编写一个程序,用 C++ 语言在 2 x n 的网格中求出最大和,使得任意两个元素都不相邻。

问题描述

为了求最大和,我们不能选择与当前元素相邻的元素,无论是垂直、水平还是对角线方向。

让我们举个例子来理解这个问题:

输入

rectGrid[2][] =389
411

输出

13

解释

所有可能的和都是

如果我们从 rectGrid[0][0] 即 3 开始,那么我们只能加 9 或 1。最大和是12.

如果从 rectGrid[1][0] 即 4 开始,那么我们只能添加 9 或 1。最大和为 13。

如果从 rectGrid[0][1] 即 8 开始,那么我们不能添加任何元素。最大和为 8。

如果从 rectGrid[1][1] 即 1 开始,那么我们不能添加任何元素。最大和为 1。

如果我们从 rectGrid[0][2] 开始,即 9,那么我们只能加 3 或 4。最大和为 13。

如果我们从 rectGrid[1][2] 开始,即 1,那么我们只能加 3 或 4。最大和为 5。

总和为 13。

解决方法

这个问题类似于我们在上一篇文章中看到的最大和问题,即没有两个元素相邻。不同之处在于这里的数组是二维的,并且相邻元素的条件不同。因此,我们将使用行和列的条件来考虑最大元素。由于每列有两行,我们将最大限度地考虑交替元素。

示例

用于说明解决方案工作原理的程序

#include<iostream>
using namespace std;
int findMax(int a, int b){
   if(a > b)
      return a;
      return b;
   }
int calcMaxSum(int rectGrid[2][20], int N){
   int currectSum = 0;
   int nextSum = 0;
   int altSum;
   for (int i = 0; i<N; i++ ){
      altSum = findMax(nextSum, currectSum);
      currectSum = nextSum + findMax(rectGrid[0][i], rectGrid[1][i]);
      nextSum = altSum;
   }
   int maxSum = findMax(nextSum, currectSum);
   return maxSum;
}
int main(){
   int rectGrid[2][20] = {{3, 8, 9, 5},
   {4, 1, 2, 7}};
   int N = 4;
   cout<<"The maximum sum in a 2 x "<<N<<" grid such that no two elements are adjacent is "<<calcMaxSum(rectGrid, N);
   return 0;
}

输出

The maximum sum in a 2 x 4 grid such that no two elements are adjacent is 15

相关文章