Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาผลรวมอาเรย์สูงสุดที่มีความยาวน้อยกว่าหรือเท่ากับ m ใน C++


ในปัญหา เราได้รับ n อาร์เรย์ที่มีความยาวต่างกัน งานของเราคือค้นหาอาร์เรย์ผลรวมสูงสุดของความยาวน้อยกว่าหรือเท่ากับ m

เราจำเป็นต้องค้นหาอาร์เรย์ย่อยจากอาร์เรย์เพื่อเพิ่มผลรวมสูงสุดและทำให้ความยาวของอาร์เรย์ย่อยทั้งหมดรวมกันเป็น m

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

n =3, m =4arrOfArr[][] ={ {5, 2, -1, 4, -3} {3, -2, 1, 6} {-2, 0, 5}} 

ผลลัพธ์

20

คำอธิบาย

SubArray คือ {5, 4}, {6}, {5},length =2 + 1 + 1 =4Sum =5 + 4 + 6 + 5 =20

แนวทางการแก้ปัญหา

ปัญหาสามารถแก้ไขได้โดยใช้วิธีการเขียนโปรแกรมแบบไดนามิก เราจะสร้างอาร์เรย์ DP และคำนวณผลรวมอาเรย์สะสมของความยาว k ซึ่งแตกต่างกันไปตั้งแต่ 0 ถึง ม.

ในอาร์เรย์ DP ให้เก็บผลรวมอาร์เรย์สูงสุดสำหรับความยาวทั้งหมดตั้งแต่ 0 ถึง m foreach อาร์เรย์ใน 2D DP จากนั้นคืนค่าผลรวมสูงสุดซึ่งจะอยู่ที่แถวสุดท้ายของอาร์เรย์

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

#include using namespace std;#define N 5int findMax(int ​​a, int b){ if(a> b) คืนค่า a; ส่งคืน b;}int findMaxSumArray(int arr[][N], int M) { int DP[N][M]; int sumArray[M]; จำนวนเต็ม[M]; memset(DP, -1, sizeof(DP[0][0]) * N * M); sumArray[0] =0; DP[0][0] =0; สำหรับ (int i =1; i <=5; i++) { int len ​​=arr[i - 1][0]; สำหรับ (int j =1; j <=len; j++) { sumArray[j] =arr[i - 1][j]; sumArray[j] +=sumArray[j - 1]; ผลรวม[j] =-100; } for (int j =1; j <=len &&j <=6; j++) สำหรับ (int k =1; k <=len; k++) if (j + k - 1 <=len) sum[j] =findMax(sum[j], sumArray[j + k - 1] - sumArray[k - 1]); สำหรับ (int j =0; j <=6; j++) DP[i][j] =DP[i - 1][j]; สำหรับ (int j =1; j <=6; j++) สำหรับ (int cur =1; cur <=j &&cur <=len; cur++) DP[i][j] =findMax(DP[i][j] , DP[i - 1][j - cur] + ผลรวม[cur]); } int maxSum =0; สำหรับ (int i =0; i <=6; i++) maxSum =findMax(maxSum, DP[5][i]); คืนค่า maxSum;}int main () { int arr[][N] ={ { 3, 2, -1, 6 }, { 2, 7, -1 }, { 3, 2, 2, -4 } }; int m =4; cout<<"อาร์เรย์ผลรวมสูงสุดของความยาวน้อยกว่าหรือเท่ากับ "< 

ผลลัพธ์

อาเรย์ผลรวมสูงสุดของความยาวน้อยกว่าหรือเท่ากับ 4 :15