查找数字字段中的最大和
Posted
技术标签:
【中文标题】查找数字字段中的最大和【英文标题】: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;
...
虽然这工作得很好,但我们的讲座还没有限制,所以我正在寻找另一种方法。
【问题讨论】:
为什么不能你使用climits
? std::numeric_limits
怎么样?您故意避免使用规范解决方案,但为了什么?
我可以使用climits
。但我认为必须有一个替代解决方案,因为我们的讲座还没有限制,我有兴趣知道它。
我应该如何使用std::numeric_limits
?我看不到如何将它集成到我的代码中
【参考方案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()() constreturn 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
【讨论】:
以上是关于查找数字字段中的最大和的主要内容,如果未能解决你的问题,请参考以下文章