Saya harus menulis program yang meringkas elemen berurutan dari array dan menghasilkan jumlah maksimum. Seperti yang akan Anda lihat, algoritme saya tidak akan berfungsi jika semua elemen negatif.

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

Saya sudah mencoba solusi ini

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

Meskipun ini berfungsi dengan baik, kami belum memiliki batasan dalam kuliah kami, jadi saya mencari cara lain.

1
Brain Damage 27 November 2017, 15:08
Mengapa tidak bisa Anda menggunakan climits? Bagaimana dengan std::numeric_limits? Anda sengaja menghindari solusi kanonik tetapi untuk apa?
 – 
Passer By
27 November 2017, 15:15
Saya bisa menggunakan climits. Tapi saya pikir harus ada solusi alternatif karena kami belum memiliki batasan dalam kuliah kami dan saya tertarik untuk mengetahuinya.
 – 
Brain Damage
27 November 2017, 15:25
Bagaimana cara saya menggunakan std::numeric_limits? Saya tidak dapat melihat bagaimana mengintegrasikannya ke dalam kode saya
 – 
Brain Damage
27 November 2017, 15:32

2 jawaban

Mengubah:

int max_sum = sums[0][0];

Dengan cara ini Anda tidak perlu khawatir tentang kisaran angka.

3
Jake Freeman 27 November 2017, 15:12
1
Tetapi akan bergantung pada rentang yang tidak kosong.
 – 
Passer By
27 November 2017, 15:14
1
Saya cenderung tidak menganggap masalah olahraga terlalu harfiah. Haruskah Anda tidak menjawab dengan praktik terbaik?
 – 
Passer By
27 November 2017, 15:16

Ini adalah salah satu motivasi utama untuk jenis std::opsional (bila semua nilai dalam rentang valid). Jika Anda tidak dapat menggunakannya, kami dapat menirunya untuk tujuan kami dengan boolean sederhana:

bool max_set = false;
int max_sum = 0;

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

Kita dapat membuat kelas sederhana untuk menirunya lebih lanjut jika kita mau (kode yang belum diuji):

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

Kami dapat terus membuat jenis ini semakin umum, tetapi kami hanya akan menerapkan kembali std::optional

0
AndyG 27 November 2017, 15:40