我必须编写一个程序来汇总数组的顺序元素并输出最大总和。正如您将看到的,如果所有元素都是负数,我的算法将无法工作。
#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;
...
虽然这种方法非常好,但我们在演讲中没有攀登过,所以我正在寻找另一种方式。
答案 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