Given an array of n non-negative numbers, the task is to find the minimum sum of elements (picked from the array) such that at least one element is picked out of every 3 consecutive elements in the array.
Examples :
Input : arr[] = {1, 2, 3}
Output : 1
Input : arr[] = {1, 2, 3, 6, 7, 1}
Output : 4
We pick 3 and 1 (3 + 1 = 4)
Note that there are following subarrays
of three consecutive elements
{1, 2, 3}, {2, 3, 6}, {3, 6, 7} and {6, 7, 1}
We have picked one element from every subarray.
Input : arr[] = {1, 2, 3, 6, 7, 1, 8, 6, 2,
7, 7, 1}
Output : 7
The result is obtained as sum of 3 + 1 + 2 + 1
Let sum(i) be the minimum possible sum when arr[i] is part of a solution sum (not necessarily result) and is last picked element. Then our result is minimum of sum(n-1), sum(n-2) and sum(n-3) [We must pick at least one of the last three elements].
We can recursively compute sum(i) as sum of arr[i] and minimum(sum(i-1), sum(i-2), sum(i-3)). Since there are overlapping subproblems in recursive structure of problem, we can use Dynamic Programming to solve this problem.
Below is the implementation of above idea.
C++
#include <iostream>
using namespace std;
int minimum( int a, int b, int c)
{
return min(min(a, b), c);
}
int findMinSum( int arr[], int n)
{
int sum[n];
sum[0] = arr[0];
sum[1] = arr[1];
sum[2] = arr[2];
for ( int i = 3; i < n; i++)
sum[i] = arr[i] + minimum(sum[i - 3], sum[i - 2], sum[i - 1]);
return minimum(sum[n - 1], sum[n - 2], sum[n - 3]);
}
int main()
{
int arr[] = { 1, 2, 3, 20, 2, 10, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
printf ( "Min Sum is %d" , findMinSum(arr, n));
return 0;
}
|
C
#include <stdio.h>
int min( int num1, int num2)
{
return (num1 > num2) ? num2 : num1;
}
int minimum( int a, int b, int c)
{
return min(min(a, b), c);
}
int findMinSum( int arr[], int n)
{
int sum[n];
sum[0] = arr[0];
sum[1] = arr[1];
sum[2] = arr[2];
for ( int i = 3; i < n; i++)
sum[i] = arr[i] + minimum(sum[i - 3], sum[i - 2], sum[i - 1]);
return minimum(sum[n - 1], sum[n - 2], sum[n - 3]);
}
int main()
{
int arr[] = { 1, 2, 3, 20, 2, 10, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
printf ( "Min Sum is %d" , findMinSum(arr, n));
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int minimum( int a, int b, int c)
{
return Math. min(Math.min(a, b), c);
}
static int findMinSum( int arr[], int n)
{
int sum[] = new int [n];
sum[ 0 ] = arr[ 0 ];
sum[ 1 ] = arr[ 1 ];
sum[ 2 ] = arr[ 2 ];
for ( int i = 3 ; i < n; i++)
sum[i] = arr[i] + minimum(sum[i - 3 ],
sum[i - 2 ], sum[i - 1 ]);
return minimum(sum[n - 1 ], sum[n - 2 ], sum[n - 3 ]);
}
public static void main (String[] args)
{
int arr[] = { 1 , 2 , 3 , 20 , 2 , 10 , 1 };
int n = arr.length;
System.out.println( "Min Sum is " + findMinSum(arr, n));
}
}
|
Python3
def minimum(a, b, c):
return min ( min (a, b), c);
def findMinSum(arr,n):
sum = []
sum .append(arr[ 0 ])
sum .append(arr[ 1 ])
sum .append(arr[ 2 ])
for i in range ( 3 , n):
sum .append( arr[i] + minimum( sum [i - 3 ],
sum [i - 2 ], sum [i - 1 ]))
return minimum( sum [n - 1 ], sum [n - 2 ], sum [n - 3 ])
arr = [ 1 , 2 , 3 , 20 , 2 , 10 , 1 ]
n = len (arr)
print ( "Min Sum is " ,findMinSum(arr, n))
|
C#
using System;
class GFG
{
static int minimum( int a, int b, int c)
{
return Math. Min(Math.Min(a, b), c);
}
static int findMinSum( int []arr, int n)
{
int []sum = new int [n];
sum[0] = arr[0];
sum[1] = arr[1];
sum[2] = arr[2];
for ( int i = 3; i < n; i++)
sum[i] = arr[i] + minimum(sum[i - 3],
sum[i - 2], sum[i - 1]);
return minimum(sum[n - 1], sum[n - 2], sum[n - 3]);
}
public static void Main ()
{
int []arr = {1, 2, 3, 20, 2, 10, 1};
int n = arr.Length;
Console.WriteLine( "Min Sum is " + findMinSum(arr, n));
}
}
|
PHP
<?php
function minimum( $a , $b , $c )
{
return min(min( $a , $b ), $c );
}
function findMinSum( $arr , $n )
{
$sum [ $n ] = 0;
$sum [0] = $arr [0];
$sum [1] = $arr [1];
$sum [2] = $arr [2];
for ( $i = 3; $i < $n ; $i ++)
$sum [ $i ] = $arr [ $i ] + minimum( $sum [ $i - 3],
$sum [ $i - 2], $sum [ $i - 1]);
return minimum( $sum [ $n - 1], $sum [ $n - 2],
$sum [ $n - 3]);
}
$arr = array (1, 2, 3, 20, 2, 10, 1);
$n = sizeof( $arr );
echo "Min Sum is " , findMinSum( $arr , $n );
?>
|
Javascript
<script>
function minimum(a, b, c)
{
return Math.min(Math.min(a, b), c);
}
function findMinSum(arr, n)
{
var sum= Array(n).fill(0);
sum[0] = arr[0];
sum[1] = arr[1];
sum[2] = arr[2];
for ( var i=3; i<n; i++)
sum[i] = arr[i] +
minimum(sum[i-3], sum[i-2], sum[i-1]);
return minimum(sum[n-1], sum[n-2], sum[n-3]);
}
var arr = [1, 2, 3, 20, 2, 10, 1];
var n = arr.length;
document.write( "Min Sum is " + findMinSum(arr, n));
</script>
|
Time Complexity : O(n)
Auxiliary Space : O(n), since n extra space has been taken.
This problem and solution are contributed by Ayush Saluja. 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.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!