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 **x _{1} < x_{2} < ….. < x_{n-1} < x_{n}**, specifying positions in miles measured from one end of the road. If we place a billboard at position x

_{i}, we receive a revenue of

**r**. There is a restriction that no two billboards can be placed within

_{i}> 0**t**miles or less than it.

Note : All possible sites from x_{1} to x_{n} 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 constarints. ` `#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; ` `} ` |

*chevron_right*

*filter_none*

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

*chevron_right*

*filter_none*

**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 contribute.geeksforgeeks.org or mail your article to contribute@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.

## Recommended Posts:

- 0-1 Knapsack Problem | DP-10
- Word Wrap Problem | DP-19
- Partition problem | DP-18
- Box Stacking Problem | DP-22
- Subset Sum Problem | DP-25
- Largest Independent Set Problem | DP-26
- Word Break Problem | DP-32
- Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
- Printing brackets in Matrix Chain Multiplication Problem
- Boolean Parenthesization Problem | DP-37
- Mobile Numeric Keypad Problem
- Vertex Cover Problem | Set 2 (Dynamic Programming Solution for Tree)
- Tiling Problem
- Dynamic Programming | High-effort vs. Low-effort Tasks Problem
- A Space Optimized DP solution for 0-1 Knapsack Problem