Su problema básico es 2 partes. Romperlos y resolverlos se vuelve más fácil.
1) Buscar todos los subconjuntos contiguos.
Dado que su secuencia de origen puede tener valores negativos, no está tan equipado para hacer juicios de valor hasta que encuentre cada subconjunto, ya que un negativo puede ser "cancelado" por otro. Entonces, deje que la primera fase sea encontrar solo los subconjuntos.
Un ejemplo de cómo se puede hacer esto es el siguiente código
// 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);
}
En el código anterior, estoy construyendo todos mis subconjuntos contiguos, teniendo la libertad de no añadir nada a un subconjunto dado que ya tiene un valor de 0 Puede omitir ese comportamiento en particular si lo desea.
2) Calcule el producto de cada subconjunto y compárelo con un valor máximo.
Una vez que haya encontrado todos sus subconjuntos elegibles, la siguiente parte es fácil.
// 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;
}
}
Agregue cualquier lógica que desee restringir la longitud de la fuente original o los candidatos del subconjunto o los valores del producto. Por ejemplo, si desea imponer requisitos de longitud mínima en cualquiera de ellos, o si se permite un producto subconjunto de 0 si está disponible un producto distinto de cero.
Además, no hago ninguna afirmación sobre el rendimiento del código, es simplemente para ilustrar la división del problema en sus partes.
gracias por la solución propuesta, pero por encima de código does't trabajar para la matriz a continuación con valores negativos. {-1, -15, -30,0, -17,2}: debe devolver 450 como el producto más grande pero devuelve 15. –
@bhakti, '-1 * -15 * -30' es' -450 '. Además, esto debería ser un comentario sobre esa respuesta. –
Realmente lo siento, ya que estoy publicando esto con un teléfono inteligente. Traté de encontrar el enlace 'agregar comentario' debajo de la publicación de Nikita pero no pude encontrar uno. Aquí con la matriz negativa anterior, el código debería devolverle un producto de -15 * -30 ya que estos son los elementos contagiosos que devuelven el producto más grande –