Related Articles

# Maximum profit after buying and selling the stocks with transaction fees | Set 2

• Difficulty Level : Hard
• Last Updated : 06 Sep, 2021

Given an array arr[] of positive integers representing prices of stocks and an integer transactionFee, the task is to find the maximum profit possible after buying and selling stocks any number of times and giving the transaction fee for each transaction.

Examples:

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

Input: arr[] = {6, 1, 7, 2, 8, 4}, transactionFee = 2
Output: 8
Explanation:
A maximum profit of 8 can be obtained by two transactions.
Transaction 1: Buy at price 1 and sell at price 7. Profit = 7 – 1 – 2 = 4.
Transaction 2: Buy at price 2 and sell at price 8. Profit = 8 – 2 – 2 = 4.
Therefore, total profit = 4 + 4 = 8, which is the maximum possible.

Input: arr[] = {2, 7, 5, 9, 6, 4}, transactionFee = 1
Output: 7

Naive Approach: Refer to the previous post for the simplest approach to solve the problem.

Time Complexity: O(N2)
Auxiliary Space: O(1)

Efficient Approach: To optimize the above approach, the idea is to use Dynamic Programming. For each day, maintain the maximum profit, if stocks are bought on that day (buy) and the maximum profit if all stocks are sold on that day (sell). For each day, update buy and sell using the following relations:

sell = max(buy +arr[i] – transactionFee, sell)

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to find the maximum``// profit with transaction fee``int` `MaxProfit(``int` `arr[], ``int` `n,``              ``int` `transactionFee)``{` `    ``int` `buy = -arr;``    ``int` `sell = 0;` `    ``// Traversing the stocks for``    ``// each day``    ``for` `(``int` `i = 1; i < n; i++) {``        ``int` `temp = buy;` `        ``// Update buy and sell``        ``buy = max(buy, sell - arr[i]);``        ``sell = max(sell,``                   ``temp + arr[i] - transactionFee);``    ``}` `    ``// Return the maximum profit``    ``return` `max(sell, buy);``}` `// Driver code``int` `main()``{``    ``// Given Input``    ``int` `arr[] = { 6, 1, 7, 2, 8, 4 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);``    ``int` `transactionFee = 2;` `    ``// Function Call``    ``cout << MaxProfit(arr, n, transactionFee);``    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.io.*;` `class` `GFG``{``  ` `    ``// Function to find the maximum``    ``// profit with transaction fee``    ``static` `int` `MaxProfit(``int` `arr[], ``int` `n,``                         ``int` `transactionFee)``    ``{` `        ``int` `buy = -arr[``0``];``        ``int` `sell = ``0``;` `        ``// Traversing the stocks for``        ``// each day``        ``for` `(``int` `i = ``1``; i < n; i++) {``            ``int` `temp = buy;` `            ``// Update buy and sell``            ``buy = Math.max(buy, sell - arr[i]);``            ``sell = Math.max(sell,``                            ``temp + arr[i] - transactionFee);``        ``}` `        ``// Return the maximum profit``        ``return` `Math.max(sell, buy);``    ``}` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{``      ` `        ``// Given Input``        ``int` `arr[] = { ``6``, ``1``, ``7``, ``2``, ``8``, ``4` `};``        ``int` `n = arr.length;``        ``int` `transactionFee = ``2``;` `        ``// Function Call``        ``System.out.println(``            ``MaxProfit(arr, n, transactionFee));``    ``}``}` `// This code is contributed by Potta Lokesh`

## Python3

 `# Python3 program for the above approach` `# Function to find the maximum``# profit with transaction fee``def` `MaxProfit(arr, n, transactionFee):``    ` `    ``buy ``=` `-``arr[``0``]``    ``sell ``=` `0` `    ``# Traversing the stocks for``    ``# each day``    ``for` `i ``in` `range``(``1``, n, ``1``):``        ``temp ``=` `buy` `        ``# Update buy and sell``        ``buy ``=` `max``(buy, sell ``-` `arr[i])``        ``sell ``=` `max``(sell, temp ``+` `arr[i] ``-``                   ``transactionFee)` `    ``# Return the maximum profit``    ``return` `max``(sell, buy)` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``# Given Input``    ``arr ``=` `[ ``6``, ``1``, ``7``, ``2``, ``8``, ``4` `]``    ``n ``=` `len``(arr)``    ``transactionFee ``=` `2` `    ``# Function Call``    ``print``(MaxProfit(arr, n, transactionFee))``    ` `# This code is contributed by SURENDRA_GANGWAR`

## C#

 `// C# program for the above approach``using` `System;` `class` `GFG {``    ` `    ``// Function to find the maximum``    ``// profit with transaction fee``    ``static` `int` `MaxProfit(``int``[] arr, ``int` `n,``                         ``int` `transactionFee)``    ``{` `        ``int` `buy = -arr;``        ``int` `sell = 0;` `        ``// Traversing the stocks for``        ``// each day``        ``for` `(``int` `i = 1; i < n; i++) {``            ``int` `temp = buy;` `            ``// Update buy and sell``            ``buy = Math.Max(buy, sell - arr[i]);``            ``sell = Math.Max(sell,``                            ``temp + arr[i] - transactionFee);``        ``}` `        ``// Return the maximum profit``        ``return` `Math.Max(sell, buy);``    ``}``    ` `    ``// Driver code``    ``public` `static` `void` `Main()``    ``{``      ` `        ``// Given Input``        ``int``[] arr = { 6, 1, 7, 2, 8, 4 };``        ``int` `n = arr.Length;``        ``int` `transactionFee = 2;` `        ``// Function Call``        ``Console.WriteLine(``            ``MaxProfit(arr, n, transactionFee));``    ``}``}` `// This code is contributed by sanjoy_62.`

## Javascript

 ``
Output:
`8`

Time Complexity: O(N)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up