📜  最大化不属于最长递增子序列的所有元素的总和

📅  最后修改于: 2021-05-17 19:35:33             🧑  作者: Mango

给定一个数组arr [] ,任务是找到所有元素的最大和,这些元素不是最长递增子序列的一部分。
例子:

方法:

  • 这个想法是找到具有最小总和的最长的增长子序列,然后从所有元素的总和中减去它。
  • 为此,我们将使用动态编程的LIS概念,将和与子序列的长度一起存储,并相应地更新最小和。

下面是上述方法的实现。

C++
// C++ program to find the Maximum sum of
// all elements which are not a part of
// longest increasing sub sequence
 
#include 
using namespace std;
 
// Function to find maximum sum
int findSum(int* arr, int n)
{
    int totalSum = 0;
 
    // Find total sum of array
    for (int i = 0; i < n; i++) {
        totalSum += arr[i];
    }
 
    // Maintain a 2D array
    int dp[2][n];
    for (int i = 0; i < n; i++) {
        dp[0][i] = 1;
        dp[1][i] = arr[i];
    }
 
    // Update the dp array along
    // with sum in the second row
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[i] > arr[j]) {
                // In case of greater length
                // Update the length along
                // with sum
                if (dp[0][i] < dp[0][j] + 1) {
                    dp[0][i] = dp[0][j] + 1;
                    dp[1][i] = dp[1][j]
                               + arr[i];
                }
 
                // In case of equal length
                // find length update length
                // with minimum sum
                else if (dp[0][i]
                         == dp[0][j] + 1) {
                    dp[1][i]
                        = min(dp[1][i],
                              dp[1][j]
                                  + arr[i]);
                }
            }
        }
    }
    int maxm = 0;
    int subtractSum = 0;
 
    // Find the sum that need to
    // be subtracted from total sum
    for (int i = 0; i < n; i++) {
        if (dp[0][i] > maxm) {
            maxm = dp[0][i];
            subtractSum = dp[1][i];
        }
        else if (dp[0][i] == maxm) {
            subtractSum = min(subtractSum,
                              dp[1][i]);
        }
    }
 
    // Return the sum
    return totalSum - subtractSum;
}
 
// Driver code
int main()
{
    int arr[] = { 4, 6, 1, 2, 3, 8 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    cout << findSum(arr, n);
 
    return 0;
}


Java
// Java program to find the Maximum sum of
// all elements which are not a part of
// longest increasing sub sequence
class GFG{
 
// Function to find maximum sum
static int findSum(int []arr, int n)
{
    int totalSum = 0;
 
    // Find total sum of array
    for(int i = 0; i < n; i++)
    {
       totalSum += arr[i];
    }
 
    // Maintain a 2D array
    int [][]dp = new int[2][n];
    for(int i = 0; i < n; i++)
    {
       dp[0][i] = 1;
       dp[1][i] = arr[i];
    }
 
    // Update the dp array along
    // with sum in the second row
    for(int i = 1; i < n; i++)
    {
       for(int j = 0; j < i; j++)
       {
          if (arr[i] > arr[j])
          {
               
              // In case of greater length
              // Update the length along
              // with sum
              if (dp[0][i] < dp[0][j] + 1)
              {
                  dp[0][i] = dp[0][j] + 1;
                  dp[1][i] = dp[1][j] + arr[i];
              }
               
              // In case of equal length
              // find length update length
              // with minimum sum
              else if (dp[0][i] == dp[0][j] + 1)
              {
                  dp[1][i] = Math.min(dp[1][i],
                                      dp[1][j] + arr[i]);
              }
          }
       }
    }
    int maxm = 0;
    int subtractSum = 0;
 
    // Find the sum that need to
    // be subtracted from total sum
    for(int i = 0; i < n; i++)
    {
       if (dp[0][i] > maxm)
       {
           maxm = dp[0][i];
           subtractSum = dp[1][i];
       }
       else if (dp[0][i] == maxm)
       {
           subtractSum = Math.min(subtractSum, dp[1][i]);
       }
    }
 
    // Return the sum
    return totalSum - subtractSum;
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 4, 6, 1, 2, 3, 8 };
    int n = arr.length;
 
    System.out.print(findSum(arr, n));
}
}
 
// This code is contributed by sapnasingh4991


Python3
# Python3 program to find the maximum sum 
# of all elements which are not a part of
# longest increasing sub sequence
 
# Function to find maximum sum
def findSum(arr, n):
 
    totalSum = 0
 
    # Find total sum of array
    for i in range(n):
        totalSum += arr[i]
 
    # Maintain a 2D array
    dp = [[0] * n for i in range(2)]
 
    for i in range(n):
        dp[0][i] = 1
        dp[1][i] = arr[i]
 
    # Update the dp array along
    # with sum in the second row
    for i in range(1, n):
        for j in range(i):
            if (arr[i] > arr[j]):
 
                # In case of greaer length
                # update the length along
                # with sum
                if (dp[0][i] < dp[0][j] + 1):
                    dp[0][i] = dp[0][j] + 1
                    dp[1][i] = dp[1][j] + arr[i]
 
                # In case of equal length
                # find length update length
                # with minimum sum
                elif (dp[0][i] == dp[0][j] + 1):
                    dp[1][i] = min(dp[1][i],
                                   dp[1][j] +
                                     arr[i])
 
    maxm = 0
    subtractSum = 0
 
    # Find the sum that need to
    # be subtracted from total sum
    for i in range(n):
        if (dp[0][i] > maxm):
            maxm = dp[0][i]
            subtractSum = dp[1][i]
 
        elif (dp[0][i] == maxm):
            subtractSum = min(subtractSum,
                              dp[1][i])
 
    # Return the sum
    return totalSum - subtractSum
 
# Driver code
arr = [ 4, 6, 1, 2, 3, 8 ]
n = len(arr)
 
print(findSum(arr, n))
 
# This code is contributed by himanshu77


C#
// C# program to find the Maximum sum of
// all elements which are not a part of
// longest increasing sub sequence
using System;
class GFG{
 
// Function to find maximum sum
static int findSum(int []arr, int n)
{
    int totalSum = 0;
 
    // Find total sum of array
    for(int i = 0; i < n; i++)
    {
        totalSum += arr[i];
    }
 
    // Maintain a 2D array
    int [,]dp = new int[2, n];
    for(int i = 0; i < n; i++)
    {
        dp[0, i] = 1;
        dp[1, i] = arr[i];
    }
 
    // Update the dp array along
    // with sum in the second row
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if (arr[i] > arr[j])
            {
                     
                // In case of greater length
                // Update the length along
                // with sum
                if (dp[0, i] < dp[0, j] + 1)
                {
                    dp[0, i] = dp[0, j] + 1;
                    dp[1, i] = dp[1, j] + arr[i];
                }
                     
                // In case of equal length
                // find length update length
                // with minimum sum
                else if (dp[0, i] == dp[0, j] + 1)
                {
                    dp[1, i] = Math.Min(dp[1, i],
                                        dp[1, j] + arr[i]);
                }
            }
        }
    }
    int maxm = 0;
    int subtractSum = 0;
 
    // Find the sum that need to
    // be subtracted from total sum
    for(int i = 0; i < n; i++)
    {
        if (dp[0, i] > maxm)
        {
            maxm = dp[0, i];
            subtractSum = dp[1, i];
        }
        else if (dp[0, i] == maxm)
        {
            subtractSum = Math.Min(subtractSum, dp[1, i]);
        }
    }
 
    // Return the sum
    return totalSum - subtractSum;
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 4, 6, 1, 2, 3, 8 };
    int n = arr.Length;
 
    Console.Write(findSum(arr, n));
}
}
 
// This code is contributed by sapnasingh4991


输出:
10

时间复杂度: O(N 2 ),其中N是数组arr []的长度
辅助空间: O(N)