Highway Billboard Problem - GeeksforGeeks

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++
Java
Python3
C#
PHP
Javascript
// C++ program to find maximum revenue by placing// billboard on the highway with given constraints.#include<bits/stdc++.h>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 Programint main(){    int m = 20;    int x[] = {6, 7, 12, 13, 14};    int revenue[] = {5, 6, 5, 3, 1};    int n = sizeof(x)/sizeof(x[0]);    int t = 5;    cout << maxRevenue(m, x, revenue, n, t) << endl;    return 0;}
// 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 Codepublic 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 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 Codeif __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# 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 Codestatic 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// PHP program to find// maximum revenue by// placing billboard on// the highway with given// constraints. function maxRevenue($m, $x,                    $revenue,                    $n, $t)                                             {    // Array to store maximum    // revenue at each miles.    $maxRev = array_fill(0, $m + 1,                            false);         // actual minimum distance    // between 2 billboards.    $nxtbb = 0;    for ($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];} // Driver Code$m = 20;$x = array(6, 7, 12, 13, 14);$revenue = array(5, 6, 5, 3, 1);$n = sizeof($x);$t = 5;echo maxRevenue($m, $x,                $revenue, $n, $t); // This code is contributed by ajit?>
<script> // Javascript program to find maximum revenue// by placing billboard on the highway// with given constraints.         function maxRevenue(m,x,revenue,n,t)    {    // Array to store maximum revenue    // at each miles.    let maxRev = new Array(m + 1);    for(let i = 0; i < m + 1; i++)        maxRev[i] = 0;       // actual minimum distance between    // 2 billboards.    let nxtbb = 0;    for (let 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    let  m = 20;    let x=[6, 7, 12, 13, 14];    let revenue=[5, 6, 5, 3, 1];    let n = x.length;    let t = 5;    document.write(maxRevenue(m, x, revenue, n, t));         // This code is contributed by rag2127 </script>
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.pdfThis 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.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
jit_t
ankthon
DrRoot_
ukasp
rag2127
sagar0719kumar
Dynamic Programming
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum size square sub-matrix with all 1s
Optimal Substructure Property in Dynamic Programming | DP-2
Optimal Binary Search Tree | DP-24
Min Cost Path | DP-6
Maximum Subarray Sum using Divide and Conquer algorithm
Greedy approach vs Dynamic programming
Maximum sum such that no two elements are adjacent
Word Break Problem | DP-32
3 Different ways to print Fibonacci series in Java
Top 50 Dynamic Programming Coding Problems for Interviews