There is a one-dimensional garden of length **N**. In each position of the **N** length garden, a fountain has been installed. Given an array **a[]**such that **a[i]** describes the coverage limit of **i ^{th}** fountain. A fountain can cover the range from the position

**max(i – a[i], 1)**to

**min(i + a[i], N)**. In beginning, all the fountains are switched off. The task is to find the minimum number of fountains needed to be activated such that the whole

**N**-length garden can be covered by water.

**Examples:**

Input:a[] = {1, 2, 1}Output:1Explanation:

For position 1: a[1] = 1, range = 1 to 2

For position 2: a[2] = 2, range = 1 to 3

For position 3: a[3] = 1, range = 2 to 3

Therefore, the fountain at position a[2] covers the whole garden.

Therefore, the required output is 1.

Input:a[] = {2, 1, 1, 2, 1}Output:2

**Approach:** The problem can be solved using Dynamic Programming. Follow the steps below to solve the problem:

- traverse the array and for every array index, i.e.
**i**^{th}fountain, find the**leftmost fountain**up to which the current fountain covers. - Then, find the rightmost fountain that the leftmost fountain obtained in the above step covers up to and update it in the
**dp[]**array. - Initialize a variable
**cntFount**to store the minimum number of fountains that need to be activated. - Now, traverse the
**dp[]**array and keep activating the fountains from the left that covers maximum fountains currently on the right and increment**cntFount**by**1**. Finally, print**cntFount**as the required answer.

Below is the implementation of the above approach.

## C++14

`// C++ program to implement` `// the above approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to find minimum` `// number of fountains to be` `// activated` `int` `minCntFoun(` `int` `a[], ` `int` `N)` `{` ` ` `// dp[i]: Stores the position of` ` ` `// rightmost fountain that can` ` ` `// be covered by water of leftmost` ` ` `// fountain of the i-th fountain` ` ` `int` `dp[N];` ` ` `// Stores index of leftmost fountain` ` ` `// in the range of i-th fountain` ` ` `int` `idxLeft;` ` ` `// Stores index of rightmost fountain` ` ` `// in the range of i-th fountain` ` ` `int` `idxRight;` ` ` `// Traverse the array` ` ` `for` `(` `int` `i = 0; i < N; i++) {` ` ` `idxLeft = max(i - a[i], 0);` ` ` `idxRight = min(i + (a[i] + 1), N);` ` ` `dp[idxLeft] = max(dp[idxLeft],` ` ` `idxRight);` ` ` `}` ` ` `// Stores count of fountains` ` ` `// needed to be activated` ` ` `int` `cntfount = 1;` ` ` `idxRight = dp[0];` ` ` `// Stores index of next fountain` ` ` `// that needed to be activated` ` ` `int` `idxNext;` ` ` `// Traverse dp[] array` ` ` `for` `(` `int` `i = 0; i < N; i++) {` ` ` `idxNext = max(idxNext,` ` ` `dp[i]);` ` ` `// If left most fountain` ` ` `// cover all its range` ` ` `if` `(i == idxRight) {` ` ` `cntfount++;` ` ` `idxRight = idxNext;` ` ` `}` ` ` `}` ` ` `return` `cntfount;` `}` `// Driver Code` `int` `main()` `{` ` ` `int` `a[] = { 1, 2, 1 };` ` ` `int` `N = ` `sizeof` `(a) / ` `sizeof` `(a[0]);` ` ` `cout << minCntFoun(a, N);` `}` |

*chevron_right*

*filter_none*

## Java

`// Java program to implement` `// the above approach` `import` `java.util.*;` `class` `GFG{` `// Function to find minimum` `// number of fountains to be` `// activated` `static` `int` `minCntFoun(` `int` `a[], ` `int` `N)` `{` ` ` `// dp[i]: Stores the position of` ` ` `// rightmost fountain that can` ` ` `// be covered by water of leftmost` ` ` `// fountain of the i-th fountain` ` ` `int` `[]dp = ` `new` `int` `[N];` ` ` `// Stores index of leftmost fountain` ` ` `// in the range of i-th fountain` ` ` `int` `idxLeft;` ` ` `// Stores index of rightmost fountain` ` ` `// in the range of i-th fountain` ` ` `int` `idxRight;` ` ` `// Traverse the array` ` ` `for` `(` `int` `i = ` `0` `; i < N; i++) ` ` ` `{` ` ` `idxLeft = Math.max(i - a[i], ` `0` `);` ` ` `idxRight = Math.min(i + (a[i] + ` `1` `), N);` ` ` `dp[idxLeft] = Math.max(dp[idxLeft],` ` ` `idxRight);` ` ` `}` ` ` `// Stores count of fountains` ` ` `// needed to be activated` ` ` `int` `cntfount = ` `1` `;` ` ` `// Stores index of next fountain` ` ` `// that needed to be activated` ` ` `int` `idxNext = ` `0` `;` ` ` `idxRight = dp[` `0` `];` ` ` `// Traverse dp[] array` ` ` `for` `(` `int` `i = ` `0` `; i < N; i++) ` ` ` `{` ` ` `idxNext = Math.max(idxNext,` ` ` `dp[i]);` ` ` `// If left most fountain` ` ` `// cover all its range` ` ` `if` `(i == idxRight) ` ` ` `{` ` ` `cntfount++;` ` ` `idxRight = idxNext;` ` ` `}` ` ` `}` ` ` `return` `cntfount;` `}` `// Driver Code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `a[] = { ` `1` `, ` `2` `, ` `1` `};` ` ` `int` `N = a.length;` ` ` ` ` `System.out.print(minCntFoun(a, N));` `}` `}` `// This code is contributed by Amit Katiyar` |

*chevron_right*

*filter_none*

## Python3

`# Python3 program to implement` `# the above appraoch` `# Function to find minimum` `# number of fountains to be` `# activated ` `def` `minCntFoun(a, N):` ` ` ` ` `# dp[i]: Stores the position of` ` ` `# rightmost fountain that can` ` ` `# be covered by water of leftmost` ` ` `# fountain of the i-th fountain` ` ` `dp ` `=` `[` `0` `] ` `*` `N` ` ` `# Traverse the array` ` ` `for` `i ` `in` `range` `(N):` ` ` `idxLeft ` `=` `max` `(i ` `-` `a[i], ` `0` `)` ` ` `idxRight ` `=` `min` `(i ` `+` `(a[i] ` `+` `1` `), N)` ` ` `dp[idxLeft] ` `=` `max` `(dp[idxLeft],` ` ` `idxRight)` ` ` `# Stores count of fountains` ` ` `# needed to be activated` ` ` `cntfount ` `=` `1` ` ` `idxRight ` `=` `dp[` `0` `]` ` ` `# Stores index of next fountain` ` ` `# that needed to be activated` ` ` `idxNext ` `=` `0` ` ` `# Traverse dp[] array` ` ` `for` `i ` `in` `range` `(N):` ` ` `idxNext ` `=` `max` `(idxNext,` ` ` `dp[i])` ` ` ` ` `# If left most fountain` ` ` `# cover all its range` ` ` `if` `(i ` `=` `=` `idxRight):` ` ` `cntfount ` `+` `=` `1` ` ` `idxRight ` `=` `idxNext` ` ` `return` `cntfount` `# Driver code` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` `a ` `=` `[ ` `1` `, ` `2` `, ` `1` `]` ` ` `N ` `=` `len` `(a)` ` ` ` ` `print` `(minCntFoun(a, N))` `# This code is contributed by Shivam Singh` |

*chevron_right*

*filter_none*

## C#

`// C# program to implement` `// the above approach` `using` `System;` `class` `GFG{` `// Function to find minimum` `// number of fountains to be` `// activated` `static` `int` `minCntFoun(` `int` `[]a, ` ` ` `int` `N)` `{` ` ` `// dp[i]: Stores the position of` ` ` `// rightmost fountain that can` ` ` `// be covered by water of leftmost` ` ` `// fountain of the i-th fountain` ` ` `int` `[]dp = ` `new` `int` `[N];` ` ` `// Stores index of leftmost ` ` ` `// fountain in the range of ` ` ` `// i-th fountain` ` ` `int` `idxLeft;` ` ` `// Stores index of rightmost ` ` ` `// fountain in the range of ` ` ` `// i-th fountain` ` ` `int` `idxRight;` ` ` `// Traverse the array` ` ` `for` `(` `int` `i = 0; i < N; i++) ` ` ` `{` ` ` `idxLeft = Math.Max(i - a[i], 0);` ` ` `idxRight = Math.Min(i + (a[i] + ` ` ` `1), N);` ` ` `dp[idxLeft] = Math.Max(dp[idxLeft],` ` ` `idxRight);` ` ` `}` ` ` `// Stores count of fountains` ` ` `// needed to be activated` ` ` `int` `cntfount = 1;` ` ` `// Stores index of next ` ` ` `// fountain that needed ` ` ` `// to be activated` ` ` `int` `idxNext = 0;` ` ` `idxRight = dp[0];` ` ` `// Traverse []dp array` ` ` `for` `(` `int` `i = 0; i < N; i++) ` ` ` `{` ` ` `idxNext = Math.Max(idxNext,` ` ` `dp[i]);` ` ` `// If left most fountain` ` ` `// cover all its range` ` ` `if` `(i == idxRight) ` ` ` `{` ` ` `cntfount++;` ` ` `idxRight = idxNext;` ` ` `}` ` ` `}` ` ` `return` `cntfount;` `}` `// Driver Code` `public` `static` `void` `Main(String[] args)` `{` ` ` `int` `[]a = {1, 2, 1};` ` ` `int` `N = a.Length;` ` ` `Console.Write(minCntFoun(a, N));` `}` `}` `// This code is contributed by gauravrajput1` |

*chevron_right*

*filter_none*

**Output**

1

**Time Complexity:** O(N)**Auxiliary Space:** O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Maximum number of given operations to remove the entire string
- Minimum number of points required to cover all blocks of a 2-D grid
- Count number of ways to cover a distance
- Count number of ways to cover a distance | Set 2
- Maximum Subset Sum possible by negating the entire sum after selecting the first Array element
- Minimum steps needed to cover a sequence of points on an infinite grid
- Minimum squares to cover a rectangle
- Minimum cost to cover the given positions in a N*M grid
- Minimum time required to cover a Binary Array
- Number of squares of side length required to cover an N*M rectangle
- Maximum number of tiles required to cover the floor of given size using 2x1 size tiles
- Vertex Cover Problem | Set 2 (Dynamic Programming Solution for Tree)
- Count of binary strings of length N having equal count of 0's and 1's and count of 1's ≥ count of 0's in each prefix substring
- Minimum value exceeding X whose count of divisors has different parity with count of divisors of X
- Maximum and minimum of an array using minimum number of comparisons
- Count minimum number of "move-to-front" moves to sort an array
- Count minimum number of subsets (or subsequences) with consecutive numbers
- Minimum count of elements that sums to a given number
- Find a number X such that (X XOR A) is minimum and the count of set bits in X and B are equal
- Minimum count of numbers required ending with 7 to sum as a given number

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.