C++ 最长的连续子序列,使得零的两倍小于等于一的三倍

C++ 最长的连续子序列,使得零的两倍小于等于一的三倍,c++,algorithm,C++,Algorithm,我试图从黑客级别解决这个问题,我尝试了蛮力fore解决方案,但它似乎不起作用。有人能给我一个有效解决这个问题的办法吗。 给定包含“0”和“1”以及整数K的二进制字符串, 求(S*K)的最长连续子序列的长度(L),使零的数量增加一倍这里有一个提示: 首先假设K=1,这看起来像(用点表示0): 关键是要注意,如果最长的可接受序列包含1,它也将包含任何相邻的序列。例如,如果最长的序列包含a处的1,则它也将包含b和c(包括)之间的所有序列 所以你只需要在一个块所在的点上分析序列 主要的问题是:如果你从

我试图从黑客级别解决这个问题,我尝试了蛮力fore解决方案,但它似乎不起作用。有人能给我一个有效解决这个问题的办法吗。

给定包含“0”和“1”以及整数K的二进制字符串, 求(S*K)的最长连续子序列的长度(L),使零的数量增加一倍这里有一个提示:

首先假设K=1,这看起来像(用点表示0):

关键是要注意,如果最长的可接受序列包含
1
,它也将包含任何相邻的序列。例如,如果最长的序列包含a处的1,则它也将包含b和c(包括)之间的所有序列

所以你只需要在一个块所在的点上分析序列

主要的问题是:如果你从一块一开始,你能进入下一块一吗?例如,如果从e开始,可以到达f处的块,但不能到达b。如果你从b出发,你可以到达d等处的街区


然后推广K>1的分析。

蛮力显然不起作用,因为它是
O((n*K)**2)
。我将在这个答案中使用python风格的列表理解。您需要一个数组
t=[3如果el==“1”else-2用于S中的el]
。现在如果使用
p[i]=t[0]+…+t[i]
数组你可以看到,在
k==1
的情况下,你基本上是在寻找一对(i,j),ip[j]-(p[i-1]如果i!=0否则0)>=0是真的,
j-i
是其中最大的
这对。现在,对于0..n-1中的每个
i,您必须找到它的
j
对,这样上面的值是最大的。对于特定的
i
可以在
O(logn)
中完成,因此这就为k==1的情况提供了和
O(logn)
解决方案。这可以扩展到一般情况下的
O(n log n)
解决方案(有一个技巧可以找到可以覆盖的最大块)。这个问题还有一个
O(n)
解决方案,但是您需要进一步检查
p
序列。不过,我不建议用脚本语言编写解决方案。即使是python中的
O(n)
解决方案也会超时…

请展示您的“暴力解决方案”,否则看起来我们正在为您完成所有工作。您好。我不是在找代码。我所需要的只是一个解决这个问题的想法。网站上有数百种解决方案。这似乎是一个动态规划问题这是一个良好的开端,但不幸的是还不够。您还可以压缩块,如
1*n0*k1*m
,其中
3*min(m,n)>=2*k
。显然,这些区块总是在一起。通过从一个1块到下一个从左到右的顺序查找最长的序列失败,例如,在此序列上:
1100100011
,其中解决方案是整个序列。
..1...11...11.....111111....111....
      e    f      b  a c    d