在数字字段中查找最大总和

时间:2017-11-27 12:08:35

标签: c++ arrays loops field

我必须编写一个程序来汇总数组的顺序元素并输出最大总和。正如您将看到的,如果所有元素都是负数,我的算法将无法工作。

#include <iostream>

int main()
{
    int nums[1000] = {-1,-3,-4,-2,-5,-1,-9,-4,-2,-2};
    int sums[100][100];
    int n = 9;

    for(int i = 0; i <= n; i++) {
        for(int j = n; j >= i; j--) {
            for(int k = j; k >= i; k--) {
                sums[i][j] += nums[k];
            }
        }

    }

    int max_sum = 0; 
    int max_begin;
    int max_end;

     for(int i = 0; i <= n; i++) {
        for(int j = i+1; j <= n; j++){
                std::cout << "i = " << i << " j = " << j << ": " << sums[i][j] << "\n";
            if(max_sum < sums[i][j]) {
                max_sum = sums[i][j];
                max_begin = i;
                max_end = j;
                }
            }
        }

    std::cout << "Maximum: " << max_sum << " bei i = " << max_begin << " bis j = " << max_end;

    return 0;
}

我已经尝试过这个解决方案

#include <climits>
...
int max_sum = INT_MIN;
...

虽然这种方法非常好,但我们在演讲中没有攀登过,所以我正在寻找另一种方式。

2 个答案:

答案 0 :(得分:3)

更改为:

int max_sum = sums[0][0];

这样你就不必担心数字的范围了。

答案 1 :(得分:0)

这是std::optional类型的主要动机之一(当范围中的所有值都有效时)。如果您不能使用它,我们可以使用一个简单的布尔值来模仿它:

bool max_set = false;
int max_sum = 0;

// ...
if (!max_set || max_sum < sums[i][j]){
   max_set = true;
   max_sum = sums[i][j];
}

如果我们喜欢(未经测试的代码),我们可以制作一个简单的课程来进一步模仿:

class optional_int{
   bool is_set = false;
   int value = 0;
public:
   bool operator()() const{return is_set;}
   int& operator=(int _value){value = _value; is_set=true; return value;}
   int& get(){
      if (!is_set){throw std::logic_error("attempting to access unset optional");}
      return value;
};

optional_int max_sum;
//...
if (!max_sum || max_sum.get() < sums[i][j]){
   max_sum = sums[i][j];
}

我们可以继续使这种类型越来越通用,但我们只是重新实施std::optional