算法以下列格式添加2D数组的元素?

时间:2016-07-20 11:05:24

标签: c++ arrays algorithm

假设任意数组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;

3 个答案:

答案 0 :(得分:0)

您可以将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可以避免指定子数组容器类型的麻烦(这样无论你使用哪个容器,代码都可以工作)。

使用非成员开始和结束的兴趣是从所选容器中抽象出来。

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

#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];
}

答案 1 :(得分:0)

由于你要求下面的伪代码c#代码片段会帮助你。我不知道你要求优化的alg。或不是,但下面的代码是计算所有可能的值(这不是我的意思的最佳解决方案)

        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;
        }

答案 2 :(得分:-1)

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;