Longest subsequence with no 0 after 1
Last Updated :
21 Jul, 2022
Given a binary array, find the length of the longest subsequence such that there is no 0 after a 1.
Examples:
Input : 1 1 0 1
Output : 3
Explanation :
If we remove 0 from the array, then no
zero comes right after one (satisfying
the condition) and the maximum game
left are 3 (i.e. 1 1 1)
Input : 0
Output : 1
Explanation :
Since he wants to save maximum game in
the array. He doesn't remove any game.
Let’s find out how many zeros will be in this sequence and then take all ones which come after the last zero. On each step take the next zero from the beginning of the sequence and count the ones after it. Update answer with the maximum value.
You can pre-calculate the number of ones on the suffix.
E.g. 0 1 0 0 1 1 1
After calculating the suffix, the array becomes :
0 4 0 0 3 2 1
Move from start to end and each time zero is found in the array increment numberofzeros by 1. If the array[index] is not zero then res = max(res, numberofzeros + value of the array at that index).
And then after the loop: res = max(res, numberofzeros)
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int maxSubseq( int vec[], int n) {
int suffix = 0;
for ( int i = n - 1; i >= 0; i--)
{
if (vec[i] == 1)
{
suffix++;
vec[i] = suffix;
}
}
int res = 0;
int zero = 0;
for ( int i = 0; i < n; i++)
{
if (vec[i] == 0)
zero++;
if (vec[i] > 0)
res = max(res, zero + vec[i]);
}
return max(res, zero);
}
int main()
{
int input[] = { 0, 1, 0, 0, 1, 0 };
int n = sizeof (input) / sizeof (input[0]);
cout << maxSubseq(input, n);
return 0;
}
|
Java
import java.io.*;
public class GFG {
static int maxSubseq( int []vec, int n)
{
int suffix = 0 ;
for ( int i = n - 1 ; i >= 0 ; i--)
{
if (vec[i] == 1 )
{
suffix++;
vec[i] = suffix;
}
}
int res = 0 ;
int zero = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (vec[i] == 0 )
zero++;
if (vec[i] > 0 )
res = Math.max(res, zero + vec[i]);
}
return Math.max(res, zero);
}
static public void main (String[] args)
{
int []input = { 0 , 1 , 0 , 0 , 1 , 0 };
int n = input.length;
System.out.println(maxSubseq(input, n));
}
}
|
Python3
def maxSubseq(vec, n):
suffix = 0
i = n - 1
while (i > = 0 ):
if (vec[i] = = 1 ):
suffix + = 1
vec[i] = suffix
i - = 1
res = 0
zero = 0
for i in range ( 0 ,n, 1 ):
if (vec[i] = = 0 ):
zero + = 1
if (vec[i] > 0 ):
res = max (res, zero + vec[i])
return max (res, zero)
if __name__ = = '__main__' :
input = [ 0 , 1 , 0 , 0 , 1 , 0 ]
n = len ( input )
print (maxSubseq( input , n))
|
C#
using System;
public class GFG {
static int maxSubseq( int []vec, int n)
{
int suffix = 0;
for ( int i = n - 1; i >= 0; i--)
{
if (vec[i] == 1)
{
suffix++;
vec[i] = suffix;
}
}
int res = 0;
int zero = 0;
for ( int i = 0; i < n; i++)
{
if (vec[i] == 0)
zero++;
if (vec[i] > 0)
res = Math.Max(res, zero + vec[i]);
}
return Math.Max(res, zero);
}
static public void Main ()
{
int []input = { 0, 1, 0, 0, 1, 0 };
int n = input.Length;
Console.WriteLine(maxSubseq(input, n));
}
}
|
PHP
<?php
function maxSubseq( $vec , $n )
{
$suffix = 0;
for ( $i = $n - 1;
$i >= 0; $i --)
{
if ( $vec [ $i ] == 1)
{
$suffix ++;
$vec [ $i ] = $suffix ;
}
}
$res = 0;
$zero = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $vec [ $i ] == 0)
$zero ++;
if ( $vec [ $i ] > 0)
$res = max( $res , $zero +
$vec [ $i ]);
}
return max( $res , $zero );
}
$input = array (0, 1, 0, 0, 1, 0);
$n = count ( $input );
echo maxSubseq( $input , $n );
?>
|
Javascript
<script>
function maxSubseq(vec, n)
{
let suffix = 0;
for (let i = n - 1; i >= 0; i--)
{
if (vec[i] == 1)
{
suffix++;
vec[i] = suffix;
}
}
let res = 0;
let zero = 0;
for (let i = 0; i < n; i++)
{
if (vec[i] == 0)
zero++;
if (vec[i] > 0)
res = Math.max(res, zero + vec[i]);
}
return Math.max(res, zero);
}
let input = [ 0, 1, 0, 0, 1, 0 ];
let n = input.length;
document.write(maxSubseq(input, n));
</script>
|
Share your thoughts in the comments
Please Login to comment...