以以下格式添加2D阵列的元素的算法

algorithm to add elements of a 2D array in the following format?

本文关键字:元素 算法 阵列 2D 格式 添加      更新时间:2023-10-16

假设任意数组X[N][3]是(如果N=3):

18 7 6
23 10 27
20 9 14

我需要添加这样的元素:

18+7+6=31, 18+23+10+27=78, 18+23+20+9+14=84

那么我需要找到最大值。在上面的情况下是84。我应该如何处理这个问题?一个适合C++的伪代码会很有帮助。

更新:对于那些认为我没有尝试过这个问题的人,我想说,我昨天花了整个时间来想出解决方案,我很沮丧,在这里寻求帮助。我想出了以下代码,但那是错误的:

   for(int k=0; k<N; k++){
      for(int i=0;i<N;i++){
        if(i<N-1-k){
            t=t+X[i][0];
        }
        else{
            for(int j=0;j<3;j++){
                t=t+X[i][j];
                if(answer<t){
                answer=t;
                }
            }
        }
      }
      t=0;
    }
    cout<<answer;

由于您需要下面的伪代码,c#代码片段将对您有所帮助。我不知道你是不是在要求一个优化的算法。或者不是,但下面的代码正在计算所有可能的值(我的意思是,这不是最佳解决方案)

        int[,] m = new int[3, 3] { { 18, 7, 6 }, { 23, 10, 27}, { 20, 9, 14 } };
        int max = Int32.MinValue;
        for (int i = 0; i < N; ++i)
        {
            int firstColl = 0;
            for (int j = 0; j < i+1; ++j)
            {
                firstColl += m[j, 0];
            }
            int value = firstColl + m[i, 1] + m[i, 2];
            if (max < value)
                max = value;
        }

您可以将std::accumulate用于此目的:

int array[][3] = { {18, 7, 6}, {23, 10, 27}, {20, 9, 14} };
auto partial_sum = 0;
auto result = std::accumulate(std::cbegin(array), std::cend(array), std::numeric_limits<int>::min(),
    [&partial_sum](int result, auto const& subarray) {
        auto new_result = partial_sum
            + std::accumulate(std::cbegin(subarray), std::cend(subarray), 0);
        partial_sum += *std::cbegin(subarray);
        return std::max(new_result, result);
    });
std::cout << result << 'n';

Coliru上的现场演示。

请注意,我使用了C++14特性:有一个通用lambda来避免指定子数组容器类型的麻烦(这样,无论使用哪个容器,代码都能工作)。

使用非成员begin和end的兴趣是将我们自己从所选的容器中抽象出来。

一个更简单的基于循环的版本:

#define N 3
int array[N][3] = { {18, 7, 6}, {23, 10, 27}, {20, 9, 14} };
int partial_sum = 0;
int result = std::numeric_limits<int>::min();
for (int i = 0; i < N; ++i) {
    int row_sum = 0;
    for (int j = 0; j < 3; ++j) {
        row_sum += array[i][j];
    }
    result = std::max(row_sum + partial_sum, result);
    partial_sum += array[i][0];
}
int add = 0;
    int sum = 0;
    int max = 0;
    for(int i = 0; i<n;i++){
        add+=arr[i][0];
        sum = add;
        for(int j=1;j<n;j++){
            sum+=arr[i][j];
        }
        if(max<sum){
            max = sum;
        }
    }
    cout<<max;