Ваша основная проблема - 2 части. Разбейте их, и решение становится легче.
1) Найти все смежные подмножества.
Поскольку ваша исходная последовательность может иметь отрицательные значения, вы не обладаете достаточной способностью делать какие-либо оценочные суждения, пока не найдете каждое подмножество, поскольку отрицательное впоследствии может быть «отменено» другим. Итак, позвольте первой фазе найти только подмножества.
Примером того, как вы можете это сделать, является следующий код
// will contain all contiguous subsets
var sequences = new List<Tuple<bool, List<int>>>();
// build subsets
foreach (int item in source)
{
var deadCopies = new List<Tuple<bool, List<int>>>();
foreach (var record in sequences.Where(r => r.Item1 && !r.Item2.Contains(0)))
{
// make a copy that is "dead"
var deadCopy = new Tuple<bool, List<int>>(false, record.Item2.ToList());
deadCopies.Add(deadCopy);
record.Item2.Add(item);
}
sequences.Add(new Tuple<bool, List<int>>(true, new List<int> { item }));
sequences.AddRange(deadCopies);
}
В вышеприведенном коде я строю все свои смежные подмножества, позволяя себе не добавлять ничего к данному подмножеству, которое уже имеет значение 0. Вы можете опустить это конкретное поведение, если хотите.
2) Рассчитайте произведение каждого подмножества и сравните его с максимальным значением.
Как только вы найдете все свои подходящие подмножества, следующая часть будет легкой.
// find subset with highest product
int maxProduct = int.MinValue;
IEnumerable<int> maxSequence = Enumerable.Empty<int>();
foreach (var record in sequences)
{
int product = record.Item2.Aggregate((a, b) => a * b);
if (product > maxProduct)
{
maxProduct = product;
maxSequence = record.Item2;
}
}
Добавьте любую логику, которую хотите ограничить длиной исходного источника или подмножества кандидатов или значений продукта. Например, если вы хотите применить требования к минимальной длине для любого из них, или если подмножество продуктов 0 допускается, если доступен ненулевой продукт.
Кроме того, я не претендую на производительность кода, это просто для иллюстрации разбивки проблемы на части.