【问题标题】:Finding the maximum sum in a field of numbers查找数字字段中的最大和
【发布时间】:2017-11-27 12:08:35
【问题描述】:

我必须编写一个程序,对数组的顺序元素求和并输出最大和。正如您将看到的,如果所有元素都是负数,我的算法将不起作用。

#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;
...

虽然这工作得很好,但我们的讲座还没有限制,所以我正在寻找另一种方法。

【问题讨论】:

  • 为什么不能你使用climitsstd::numeric_limits 怎么样?您故意避免使用规范解决方案,但为了什么?
  • 我可以使用climits。但我认为必须有一个替代解决方案,因为我们的讲座还没有限制,我有兴趣知道它。
  • 我应该如何使用std::numeric_limits?我看不到如何将它集成到我的代码中

标签: c++ arrays loops field


【解决方案1】:

改为:

int max_sum = sums[0][0];

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

【讨论】:

  • 但是会依赖一个非空范围。
  • 我倾向于不从字面上理解运动问题。你不应该用最佳实践来回答吗?
【解决方案2】:

这是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多