Deskripsi Masalah: Array dengan elemen N, elemen N ini bisa positif atau negatif. Temukan jumlah subarray terbesar.
Metode 1: Metode Brute Force
Ide: Cara termudah dan termudah untuk dipikirkan adalah dengan menemukan semua subarray, kemudian menemukan jumlah dari semua subarray, dan mendapatkan nilai maksimum dalam jumlah semua subarray.
/ *** Metode 1 (Metode Brute Force): Temukan jumlah subarray maksimum dalam dua loop*/ public static int maxsubarray1 (int [] a) {int i, j; int thissum = 0; int maxsum = 0; untuk (i = 0; i <a.length; i ++) {thissum = a [i]; untuk (j = i+1; j <a.length; j ++) {thissum+= a [j]; if (thissum> maxsum) {maxsum = thissum; }} return maxsum; }Metode 2: Pemrograman Dinamis yang Dioptimalkan
Ide: Pertama, menurut hubungan antara elemen terakhir A [n-1] dari array dan subarray terbesar, itu dapat dibagi menjadi tiga situasi berikut:
1) Subarray maksimum berisi [N-1], yaitu, diakhiri dengan [N-1].
2) A [N-1] sendiri membentuk subarray terbesar.
3) Subarray maksimum tidak mengandung [n-1], jadi menemukan subarray maksimum dari [1, ..., n-1] dapat dikonversi untuk menemukan subarray maksimum dari [1, ..., n-2].
Melalui analisis di atas, kita dapat menarik kesimpulan berikut: dengan asumsi bahwa jumlah array terbesar (a [0], ... A [i-1]) telah dihitung sebagai semua [I-1], dan jumlah array terbesar dari [i-1] di (A [0], ... A [I-1]) juga dihitung sebagai akhir [I-1].
Maka hubungan berikut dapat diperoleh: semua [i-1] = max {a [i-1], end [i-1], semua [i-1]}. Gunakan rumus ini dan gagasan pemrograman dinamis untuk menyelesaikan masalah. (Kode ini juga memecahkan masalah posisi awal dan posisi akhir)
/** * Metode 2: Metode pemrograman dinamis yang dioptimalkan * Nend diperoleh dengan menambahkan array ke [i] secara berurutan, dan kemudian membandingkannya dengan [i] ", dan menyimpan yang lebih besar. Karena jika angka sebelumnya ditambahkan ke dalam satu -satunya yang tidak ada yang ada di dalamnya. Sebelum*/public static int max (int m, int n) {return m> n? m: n;} public static int maxsubarray2 (int [] a) {int nall = a [0]; // jumlah subarrays maksimum numer (0] untuk numer (0];//jumlah numer numer; {nend = max (nend+a [i], a [i]); maxsum = integer.min_value; int nStart = 0; untuk (int i = 0; i <a.length; i ++) {if (nsum <0) {nsum = a [i]; nStart = i; } else {nsum+= a [i]; } if (nsum> maxsum) {maxsum = nsum; mulai = nStart; end = i; }} return maxsum; }Di atas adalah semua konten artikel ini. Saya berharap konten artikel ini akan membantu untuk belajar atau bekerja semua orang. Saya juga berharap untuk mendukung wulin.com lebih lanjut!