1后没有0的最长子序列
给定一个二进制数组,求最长子序列的长度,使得 1 之后没有 0。
例子:
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.
让我们找出这个序列中有多少个零,然后取最后一个零之后的所有零。在每一步中,从序列的开头取下一个零并计算其后的零。用最大值更新答案。
您可以预先计算后缀上的个数。
例如0 1 0 0 1 1 1
计算后缀后,数组变为:
0 4 0 0 3 2 1
从头到尾移动,每次在数组中找到零时,将 numberofzeros 增加 1。如果 array[index] 不为零,则 res = max(res, numberofzeros + 该索引处数组的值)。
然后在循环之后: res = max(res, numberofzeros)
C++
// CPP program to find longest subsequence
// such that there is no 0 after 1.
#include
using namespace std;
int maxSubseq(int vec[], int n) {
// Store the count of number of ones
// from right to left in the array
int suffix = 0;
for (int i = n - 1; i >= 0; i--)
{
if (vec[i] == 1)
{
suffix++;
vec[i] = suffix;
}
}
// Traverse from left to right, keep count
// of 0s and for every 0, check number of
// 1s after it. Update the result if needed.
int res = 0;
int zero = 0;
for (int i = 0; i < n; i++)
{
if (vec[i] == 0)
zero++;
// Checking the maximum size
if (vec[i] > 0)
res = max(res, zero + vec[i]);
}
// Checking the maximum size
return max(res, zero);
}
// Driver Code
int main()
{
int input[] = { 0, 1, 0, 0, 1, 0 };
int n = sizeof(input) / sizeof(input[0]);
cout << maxSubseq(input, n);
return 0;
}
Java
// java program to find longest subsequence
// such that there is no 0 after 1.
import java.io.*;
public class GFG {
static int maxSubseq(int []vec, int n)
{
// Store the count of number of
// ones from right to left in
// the array
int suffix = 0;
for (int i = n - 1; i >= 0; i--)
{
if (vec[i] == 1)
{
suffix++;
vec[i] = suffix;
}
}
// Traverse from left to right, keep
// count of 0s and for every 0, check
// number of 1s after it. Update the
// result if needed.
int res = 0;
int zero = 0;
for (int i = 0; i < n; i++)
{
if (vec[i] == 0)
zero++;
// Checking the maximum size
if (vec[i] > 0)
res = Math.max(res, zero + vec[i]);
}
// Checking the maximum size
return Math.max(res, zero);
}
// Driver Code
static public void main (String[] args)
{
int []input = { 0, 1, 0, 0, 1, 0 };
int n = input.length;
System.out.println(maxSubseq(input, n));
}
}
// This code is contributed by vt_m.
Python3
# Python 3 program to find longest subsequence
# such that there is no 0 after 1.
def maxSubseq(vec, n):
# Store the count of number of ones
# from right to left in the array
suffix = 0
i = n-1
while(i >= 0):
if (vec[i] == 1):
suffix += 1
vec[i] = suffix
i -= 1
# Traverse from left to right, keep count
# of 0s and for every 0, check number of
# 1s after it. Update the result if needed.
res = 0
zero = 0
for i in range(0,n,1):
if (vec[i] == 0):
zero += 1
# Checking the maximum size
if (vec[i] > 0):
res = max(res, zero + vec[i])
# Checking the maximum size
return max(res, zero)
# Driver code
if __name__ == '__main__':
input = [0, 1, 0, 0, 1, 0]
n = len(input)
print(maxSubseq(input, n))
# This code is contributed by
# Surendra_Gangwar
C#
// C# program to find longest subsequence
// such that there is no 0 after 1.
using System;
public class GFG {
static int maxSubseq(int []vec, int n)
{
// Store the count of number of
// ones from right to left in
// the array
int suffix = 0;
for (int i = n - 1; i >= 0; i--)
{
if (vec[i] == 1)
{
suffix++;
vec[i] = suffix;
}
}
// Traverse from left to right, keep
// count of 0s and for every 0, check
// number of 1s after it. Update the
// result if needed.
int res = 0;
int zero = 0;
for (int i = 0; i < n; i++)
{
if (vec[i] == 0)
zero++;
// Checking the maximum size
if (vec[i] > 0)
res = Math.Max(res, zero + vec[i]);
}
// Checking the maximum size
return Math.Max(res, zero);
}
// Driver Code
static public void Main ()
{
int []input = { 0, 1, 0, 0, 1, 0 };
int n = input.Length;
Console.WriteLine(maxSubseq(input, n));
}
}
// This code is contributed by vt_m.
PHP
= 0; $i--)
{
if ($vec[$i] == 1)
{
$suffix++;
$vec[$i] = $suffix;
}
}
// Traverse from left to
// right, keep count of
// 0s and for every 0,
// check number of 1s after
// it. Update the result if
// needed.
$res = 0;
$zero = 0;
for ($i = 0; $i < $n; $i++)
{
if ($vec[$i] == 0)
$zero++;
// Checking the
// maximum size
if ($vec[$i] > 0)
$res = max($res, $zero +
$vec[$i]);
}
// Checking the
// maximum size
return max($res, $zero);
}
// Driver Code
$input = array(0, 1, 0, 0, 1, 0);
$n = count($input);
echo maxSubseq($input, $n);
// This code is contributed
// by anuj_67.
?>
Javascript
输出:
4