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

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


ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ของจำนวนเต็ม N และค่าดัชนีสองค่า x และ y งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมสูงสุดที่เพิ่มขึ้นจากคำนำหน้าและองค์ประกอบที่กำหนดหลังจากคำนำหน้าจะต้องอยู่ใน C ++

คำอธิบายปัญหา

เราจะหาผลรวมสูงสุดของลำดับที่เพิ่มขึ้นจนถึงดัชนี x และรวมองค์ประกอบที่ดัชนี y

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

อินพุต

arr[] = {1, 5, 9, 131, 6, 100, 11, 215}, x = 4, y = 6

ผลลัพธ์

26

คำอธิบาย

เราจะใช้ลำดับต่อไปจนถึงดัชนี 3 และสุดท้ายรวม arr[6] =11

ลำดับถัดมาคือ {1, 5, 9, 11} ผลรวม =1+5+9+11 =26

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

วิธีง่ายๆ คือการสร้างอาร์เรย์ใหม่จนถึงดัชนี x แล้วเพิ่มองค์ประกอบที่ดัชนี y ต่อท้าย จากนั้นคำนวณลำดับย่อยที่เพิ่มขึ้นทั้งหมด แล้วทิ้งทั้งหมดที่ไม่สามารถรวมองค์ประกอบ arr[y] และหาค่า maxSum

แนวทางที่มีประสิทธิภาพอีกวิธีหนึ่งในการแก้ปัญหาคือการใช้แนวทางการเขียนโปรแกรมแบบไดนามิก แนวคิดคือการสร้างอาร์เรย์ 2 มิติ DP[][] และเก็บผลรวมสูงสุดของการเพิ่มลำดับย่อย ค่าที่ DP[x][y] จะให้ผลรวมสูงสุดจนถึงดัชนี x รวมถึงองค์ประกอบ arr[y].

ตัวอย่าง

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

#include <iostream>
using namespace std;
int DP[100][100];
void preCalcMaxSum(int arr[], int N){
   for (int i = 0; i < N; i++) {
      if (arr[i] > arr[0])
         DP[0][i] = arr[i] + arr[0];
      else
         DP[0][i] = arr[i];
   }
   for (int i = 1; i < N; i++) {
      for (int j = 0; j < N; j++) {
         if (arr[j] > arr[i] && j > i) {
            if (DP[i - 1][i] + arr[j] > DP[i - 1][j])
               DP[i][j] = DP[i - 1][i] + arr[j];
            else
               DP[i][j] = DP[i - 1][j];
         }
         else
            DP[i][j] = DP[i - 1][j];
      }
   }
}
int main() {
   int arr[] = {1, 5, 9, 131, 6, 100, 11, 215};
   int N = sizeof(arr) / sizeof(arr[0]);
   int x = 4, y = 6;
   preCalcMaxSum(arr, N);
   cout<<"The maximum sum increasing subsequence from a prefix and a given element after prefix is must is ";
   cout<<DP[x][y];
   return 0;
}

ผลลัพธ์

The maximum sum increasing subsequence from a prefix and a given element after prefix is must is 26

แนวทางที่มีประสิทธิภาพ กำลังใช้เพื่อค้นหาผลรวมสูงสุดของการเพิ่มลำดับย่อยจนถึงดัชนี x ในลักษณะที่องค์ประกอบที่ใหญ่ที่สุดของลำดับนั้นน้อยกว่าองค์ประกอบที่ดัชนี y สำหรับสิ่งนี้ เราจะใช้วิธีการเขียนโปรแกรมแบบไดนามิกอีกครั้ง

ตัวอย่าง

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

#include <iostream>
using namespace std;
int calcMaxSum(int arr[], int n, int x, int y){
   int DP[x] = {0};
   int maxSum = -1;
   for (int i = 0; i <= x; i++)
      DP[i] = arr[i];
   for (int i = 0; i <= x; i++) {
      if (arr[i] >= arr[y]) {
         continue;
      }
      for (int j = 0; j < i; j++) {
         if (arr[i] > arr[j])
            DP[i] += arr[j];
            maxSum = max(maxSum, DP[i]);
      }
   }
   if (maxSum == -1) {
      return arr[y];
   }
   return maxSum + arr[y];
}
int main(){
   int arr[] = {1, 5, 9, 131, 6, 100, 11, 215};
   int N = sizeof(arr) / sizeof(arr[0]);
   int x = 4, y = 6;
   cout<<"The maximum sum increasing subsequence from a prefix and a given element after prefix is must is ";
   cout<<calcMaxSum(arr, N, x, y);
   return 0;
}

ผลลัพธ์

The maximum sum increasing subsequence from a prefix and a given element after prefix is must is 26