Encuentre subsecuencia de longitud máxima que satisfaga simultáneamente dos restricciones de orden

8

Se nos da un conjunto de frutas. Cada fruta tiene un precio y un contenido de vitaminas ; asociamos la fruta con el par ordenado . Ahora tenemos que organizar estas frutas de tal manera que la lista ordenada contenga los precios en orden ascendente y el contenido de vitaminas en orden descendente.F={f1,f2,f3,,fN}NPiVifi(Pi,Vi)

Ejemplo 1 : y .N=4F={(2,8),(5,11),(7,9),(10,2)}

Si organizamos la lista de manera que todos los precios estén en orden ascendente y los contenidos de vitaminas en orden descendente, las listas válidas son las siguientes:

  • [(2,8)]
  • [(5,11)]
  • [(7,9)]
  • [(10,2)]
  • [(2,8),(10,2)]
  • [(5,11),(7,9)]
  • [(5,11),(10,2)]
  • [(7,9),(10,2)]
  • [(5,11),(7,9),(10,2)]

De las listas anteriores, quiero elegir la lista de tamaño máximo. Si más de una lista tiene un tamaño máximo, deberíamos elegir la lista de tamaño máximo cuya suma de precios sea menor. La lista que debe elegirse en el ejemplo anterior es .{(5,11),(7,9),(10,2)}

Ejemplo 2 : yN=10

F={(99,10),(12,23),(34,4),(10,5),(87,11),(19,10),(90,18),(43,90),(13,100),(78,65)}

La respuesta a este ejemplo de ejemplo es .[(13,100),(43,90),(78,65),(87,11),(99,10)]

Hasta ahora, esto es lo que he estado haciendo:

  1. Ordene la lista original en orden ascendente de precio;
  2. Encuentra todas las subsecuencias de la lista ordenada;
  3. Compruebe si la subsecuencia es válida y compare todas las subsecuencias válidas.

Sin embargo, esto lleva tiempo exponencial; ¿Cómo puedo resolver este problema de manera más eficiente?

Jack
fuente

Respuestas:

5

Una solución de programación dinámica funcionaría aquí, si el contenido de vitaminas proviene de un conjunto finito (por ejemplo, enteros delimitados). Primero, clasifique las frutas según el precio ascendente y, en los casos en que dos o más frutas tengan el mismo precio, clasifíquelas según el contenido de vitaminas (descendente). Ahora, defina como el número máximo de frutas en una sublista, que contiene solo las últimas frutas (de la lista ordenada), que tiene un contenido de vitaminas como máximo . y uso de la programación dinámica le brinda una solución que se ejecuta enM[f,v]fvM[0,]=0

M[f,v]={max{M[f1,v],1+M[f1,Vf]}if Vf<=vM[f1,v]otherwise
O(number of fruit×possible vitamin values) .
Tom van der Zanden
fuente
:: ¿Puedes ser más específico por favor?
Jack
Bueno, ¿sobre qué le gustaría obtener más detalles? ¿No estás familiarizado con la programación dinámica?
Tom van der Zanden