# Highway Billboard Problem

• Difficulty Level : Medium
• Last Updated : 05 Aug, 2021

Consider a highway of M miles. The task is to place billboards on the highway such that revenue is maximized. The possible sites for billboards are given by number x1 < x2 < ….. < xn-1 < xn, specifying positions in miles measured from one end of the road. If we place a billboard at position xi, we receive a revenue of ri > 0. There is a restriction that no two billboards can be placed within t miles or less than it.
Note : All possible sites from x1 to xn are in range from 0 to M as need to place billboards on a highway of M miles.
Examples:

```Input : M = 20
x[]       = {6, 7, 12, 13, 14}
revenue[] = {5, 6, 5,  3,  1}
t = 5
Output: 10
By placing two billboards at 6 miles and 12
miles will produce the maximum revenue of 10.

Input : M = 15
x[] = {6, 9, 12, 14}
revenue[] = {5, 6, 3, 7}
t = 2
Output : 18  ```

Let maxRev[i], 1 <= i <= M, be the maximum revenue generated from beginning to i miles on the highway. Now for each mile on the highway, we need to check whether this mile has the option for any billboard, if not then the maximum revenue generated till that mile would be same as maximum revenue generated till one mile before. But if that mile has the option for billboard then we have 2 options:
1. Either we will place the billboard, ignore the billboard in previous t miles, and add the revenue of the billboard placed.
2. Ignore this billboard. So maxRev[i] = max(maxRev[i-t-1] + revenue[i], maxRev[i-1])
Below is implementation of this approach:

## C++

 `// C++ program to find maximum revenue by placing``// billboard on the highway with given constraints.``#include``using` `namespace` `std;` `int` `maxRevenue(``int` `m, ``int` `x[], ``int` `revenue[], ``int` `n,``                                              ``int` `t)``{``    ``// Array to store maximum revenue at each miles.``    ``int` `maxRev[m+1];``    ``memset``(maxRev, 0, ``sizeof``(maxRev));` `    ``// actual minimum distance between 2 billboards.``    ``int` `nxtbb = 0;``    ``for` `(``int` `i = 1; i <= m; i++)``    ``{``        ``// check if all billboards are already placed.``        ``if` `(nxtbb < n)``        ``{``            ``// check if we have billboard for that particular``            ``// mile. If not, copy the previous maximum revenue.``            ``if` `(x[nxtbb] != i)``                ``maxRev[i] = maxRev[i-1];` `            ``// we do have billboard for this mile.``            ``else``            ``{``                ``// We have 2 options, we either take current``                ``// or we ignore current billboard.` `                ``// If current position is less than or equal to``                ``// t, then we can have only one billboard.``                ``if` `(i <= t)``                    ``maxRev[i] = max(maxRev[i-1], revenue[nxtbb]);` `                ``// Else we may have to remove previously placed``                ``// billboard``                ``else``                    ``maxRev[i] = max(maxRev[i-t-1]+revenue[nxtbb],``                                                  ``maxRev[i-1]);` `                ``nxtbb++;``            ``}``        ``}``        ``else``            ``maxRev[i] = maxRev[i - 1];``    ``}` `    ``return` `maxRev[m];``}` `// Driven Program``int` `main()``{``    ``int` `m = 20;``    ``int` `x[] = {6, 7, 12, 13, 14};``    ``int` `revenue[] = {5, 6, 5, 3, 1};``    ``int` `n = ``sizeof``(x)/``sizeof``(x);``    ``int` `t = 5;``    ``cout << maxRevenue(m, x, revenue, n, t) << endl;``    ``return` `0;``}`

## Java

 `// Java program to find maximum revenue``// by placing billboard on the highway``// with given constraints.` `class` `GFG``{``    ` `static` `int` `maxRevenue(``int` `m, ``int``[] x,``                    ``int``[] revenue,``                    ``int` `n, ``int` `t)``{``    ` `    ``// Array to store maximum revenue``    ``// at each miles.``    ``int``[] maxRev = ``new` `int``[m + ``1``];``    ``for``(``int` `i = ``0``; i < m + ``1``; i++)``        ``maxRev[i] = ``0``;` `    ``// actual minimum distance between``    ``// 2 billboards.``    ``int` `nxtbb = ``0``;``    ``for` `(``int` `i = ``1``; i <= m; i++)``    ``{``        ``// check if all billboards are``        ``// already placed.``        ``if` `(nxtbb < n)``        ``{``            ``// check if we have billboard for``            ``// that particular mile. If not,``            ``// copy the previous maximum revenue.``            ``if` `(x[nxtbb] != i)``                ``maxRev[i] = maxRev[i - ``1``];` `            ``// we do have billboard for this mile.``            ``else``            ``{``                ``// We have 2 options, we either take``                ``// current or we ignore current billboard.` `                ``// If current position is less than or``                ``// equal to t, then we can have only``                ``// one billboard.``                ``if` `(i <= t)``                    ``maxRev[i] = Math.max(maxRev[i - ``1``],``                                        ``revenue[nxtbb]);` `                ``// Else we may have to remove``                ``// previously placed billboard``                ``else``                    ``maxRev[i] = Math.max(maxRev[i - t - ``1``] +``                                        ``revenue[nxtbb],``                                        ``maxRev[i - ``1``]);` `                ``nxtbb++;``            ``}``        ``}``        ``else``            ``maxRev[i] = maxRev[i - ``1``];``    ``}` `    ``return` `maxRev[m];``}` `// Driver Code``public` `static` `void` `main(String []args)``{``    ``int` `m = ``20``;``    ``int``[] x = ``new` `int``[]{``6``, ``7``, ``12``, ``13``, ``14``};``    ``int``[] revenue = ``new` `int``[]{``5``, ``6``, ``5``, ``3``, ``1``};``    ``int` `n = x.length;``    ``int` `t = ``5``;``    ``System.out.println(maxRevenue(m, x, revenue, n, t));``}``}` `// This code is contributed by Ita_c.`

## Python3

 `# Python3 program to find maximum revenue``# by placing billboard on the highway with``# given constraints.` `def` `maxRevenue(m, x, revenue, n, t) :``    ` `    ``# Array to store maximum revenue``    ``# at each miles.``    ``maxRev ``=` `[``0``] ``*` `(m ``+` `1``)` `    ``# actual minimum distance between``    ``# 2 billboards.``    ``nxtbb ``=` `0``;``    ``for` `i ``in` `range``(``1``, m ``+` `1``) :``        ` `        ``# check if all billboards are``        ``# already placed.``        ``if` `(nxtbb < n) :``            ` `            ``# check if we have billboard for``            ``# that particular mile. If not,``            ``# copy the previous maximum revenue.``            ``if` `(x[nxtbb] !``=` `i) :``                ``maxRev[i] ``=` `maxRev[i ``-` `1``]` `            ``# we do have billboard for this mile.``            ``else` `:``            ` `                ``# We have 2 options, we either take``                ``# current or we ignore current billboard.` `                ``# If current position is less than or``                ``# equal to t, then we can have only``                ``# one billboard.``                ``if` `(i <``=` `t) :``                    ``maxRev[i] ``=` `max``(maxRev[i ``-` `1``],``                                    ``revenue[nxtbb])` `                ``# Else we may have to remove``                ``# previously placed billboard``                ``else` `:``                    ``maxRev[i] ``=` `max``(maxRev[i ``-` `t ``-` `1``] ``+``                                    ``revenue[nxtbb],``                                    ``maxRev[i ``-` `1``]);` `                ``nxtbb ``+``=` `1``    ` `        ``else` `:``            ` `            ``maxRev[i] ``=` `maxRev[i ``-` `1``]``    ` `    ``return` `maxRev[m]``    ` `# Driver Code``if` `__name__ ``=``=` `"__main__"` `:``    ` `    ``m ``=` `20``    ``x ``=` `[``6``, ``7``, ``12``, ``13``, ``14``]``    ``revenue ``=` `[``5``, ``6``, ``5``, ``3``, ``1``]``    ``n ``=` `len``(x)``    ``t ``=` `5``    ``print``(maxRevenue(m, x, revenue, n, t))` `# This code is contributed by Ryuga`

## C#

 `// C# program to find maximum revenue``// by placing billboard on the highway``// with given constraints.``using` `System;` `class` `GFG``{``static` `int` `maxRevenue(``int` `m, ``int``[] x,``                      ``int``[] revenue,``                      ``int` `n, ``int` `t)``{``    ``// Array to store maximum revenue``    ``// at each miles.``    ``int``[] maxRev = ``new` `int``[m + 1];``    ``for``(``int` `i = 0; i < m + 1; i++)``        ``maxRev[i] = 0;` `    ``// actual minimum distance between``    ``// 2 billboards.``    ``int` `nxtbb = 0;``    ``for` `(``int` `i = 1; i <= m; i++)``    ``{``        ``// check if all billboards are``        ``// already placed.``        ``if` `(nxtbb < n)``        ``{``            ``// check if we have billboard for``            ``// that particular mile. If not,``            ``// copy the previous maximum revenue.``            ``if` `(x[nxtbb] != i)``                ``maxRev[i] = maxRev[i - 1];` `            ``// we do have billboard for this mile.``            ``else``            ``{``                ``// We have 2 options, we either take``                ``// current or we ignore current billboard.` `                ``// If current position is less than or``                ``// equal to t, then we can have only``                ``// one billboard.``                ``if` `(i <= t)``                    ``maxRev[i] = Math.Max(maxRev[i - 1],``                                         ``revenue[nxtbb]);` `                ``// Else we may have to remove``                ``// previously placed billboard``                ``else``                    ``maxRev[i] = Math.Max(maxRev[i - t - 1] +``                                         ``revenue[nxtbb],``                                         ``maxRev[i - 1]);` `                ``nxtbb++;``            ``}``        ``}``        ``else``            ``maxRev[i] = maxRev[i - 1];``    ``}` `    ``return` `maxRev[m];``}` `// Driver Code``static` `void` `Main()``{``    ``int` `m = 20;``    ``int``[] x = ``new` `int``[]{6, 7, 12, 13, 14};``    ``int``[] revenue = ``new` `int``[]{5, 6, 5, 3, 1};``    ``int` `n = x.Length;``    ``int` `t = 5;``    ``Console.Write(maxRevenue(m, x, revenue, n, t));``}``}` `// This code is contributed by DrRoot_`

## PHP

 ``

## Javascript

 ``

Output:

`10`

Time Complexity: O(M), where M is distance of total Highway.
Auxiliary Space: O(M).
Source :
https://courses.cs.washington.edu/courses/cse421/06au/slides/Lecture18/Lecture18.pdf
This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.