# Maximum profit by buying and selling a share at most twice

Dynamic ProgrammingData StructureAlgorithms

#### Artificial Intelligence : The Future Of Programming

15 Lectures 54 mins

#### Beyond Basic Programming - Intermediate Python

Most Popular

36 Lectures 3 hours

#### C Programming from scratch- Master C Programming

Best Seller

60 Lectures 8 hours

In a trading, one buyer buys and sells the shares, at morning and the evening respectively. If at most two transactions are allowed in a day. The second transaction can only start after the first one is completed. If stock prices are given, then find the maximum profit that the buyer can make.

## Input and Output

Input:
A list of stock prices. {2, 30, 15, 10, 8, 25, 80}
Output:
Here the total profit is 100. As buying at price 2 and selling at price 30.
so profit 28. Then buy at price 8 and sell it again at price 80.
So profit 72. So the total profit 28 + 72 = 100

## Algorithm

findMaxProfit(pricelist, n)

Input − List of all prices, number of items in the list.

Output − Maximum Profit.

Begin
define profit array of size n and fill with 0
maxPrice := pricelist[n-1]          //last item is chosen

for i := n-2 down to 0, do
if pricelist[i] > maxPrice, then
maxPrice := pricelist[i]
profit[i] := maximum of profit[i+1] and maxProfit – pricelist[i]
done

minProce := pricelist           //first item is chosen
for i := 1 to n-1, do
if pricelist[i] < minPrice, then
minPrice := pricelist[i]
profit[i] := maximum of profit[i-1] and (profit[i]+(pricelist[i] - minPrice))
done

return profit[n-1]
End



## Example

#include<iostream>
using namespace std;

int max(int a, int b) {
return (a>b)?a:b;
}

int findMaxProfit(int priceList[], int n) {
int *profit = new int[n];
for (int i=0; i<n; i++)            //initialize profit list with 0
profit[i] = 0;

int maxPrice = priceList[n-1];        //initialize with last element of price list

for (int i=n-2;i>=0;i--) {
if (priceList[i] > maxPrice)
maxPrice = priceList[i];

profit[i] = max(profit[i+1], maxPrice - priceList[i]);     //find the profit for selling in maxPrice
}

int minPrice = priceList;            //first item of priceList as minimum

for (int i=1; i<n; i++) {
if (priceList[i] < minPrice)
minPrice = priceList[i];

profit[i] = max(profit[i-1], profit[i] + (priceList[i]- minPrice) );
}

int result = profit[n-1];
return result;
}

int main() {
int priceList[] = {2, 30, 15, 10, 8, 25, 80};
int n = 7;
cout << "Maximum Profit = " << findMaxProfit(priceList, n);
}

## Output

Maximum Profit = 100