Open In App

Highway Billboard Problem

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

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<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 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[0]);
    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




<?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
?>


Javascript




<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.pdf

 



Last Updated : 05 Aug, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads