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.
2 jawaban
Mengubah:
int max_sum = sums[0][0];
Dengan cara ini Anda tidak perlu khawatir tentang kisaran angka.
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
climits
? Bagaimana denganstd::numeric_limits
? Anda sengaja menghindari solusi kanonik tetapi untuk apa?climits
. Tapi saya pikir harus ada solusi alternatif karena kami belum memiliki batasan dalam kuliah kami dan saya tertarik untuk mengetahuinya.std::numeric_limits
? Saya tidak dapat melihat bagaimana mengintegrasikannya ke dalam kode saya