UEA: Diseño de Algoritmos
Trimestre: 2007 Invierno
Entrega: 9 de marzo de 2007 a las 10pm

Problema 1: Diseñe un algoritmo usando la técnica de programación dinámica para resolver el siguiente problema: Sea N un entero positivo y A un arreglo A[1], A[2], ..., A[N] de enteros positivos. Los índices 1 <= I1 < I2 < ... < IK <= N forman un subarreglo ascendente de A de longitud K si se cumple que A[I1] < A[I2] < ... < A[IK]. Su algoritmo deberá encontrar un subarreglo ascendente de A con la mayor longitud posible. Por ejemplo, si A = [3, 1, 4, 1, 5, 9, 2, 6, 5] entonces los índices I1 = 1, I2 = 3, I3 = 5 e I4 = 8 forman el subarreglo ascendente [3, 4, 5, 6] de longitud 4. Escriba un programa llamado arreglo basado en su algoritmo que acepte como entrada el entero positivo N y un arreglo A de N enteros positivos y que escriba como salida la máxima longitud K de un subarreglo ascendente de A seguido de los K índices correspondientes. De nuevo, si la entrada fuera 9 3 1 4 1 5 9 2 6 5 entonces la salida podría ser 4 1 3 5 8. Puede suponer que 1 <= N <= 1000 y que A es un arreglo de int. Notas: Observe que puede haber más de una salida correcta y que el primer número de la entrada y el primer número de la salida indican cuántos números siguen.

Problema 2: Diseñe un algoritmo usando la técnica de programación dinámica para resolver el siguiente problema: Un estudiante está cursando M materias y le quedan D días para estudiar. La principal preocupación del estudiante es no reprobar todas las materias. Si la probabilidad de reprobar cada una de las M materias es p1, p2, ..., pM entonces la probabilidad de reprobar todas las materias es el producto p1p2...pM. La probabilidad de reprobar una materia depende del número de días completos que le dedique a estudiar esa materia. Usted tiene una tabla P que para cada materia J (con 1 <= J <= M) y cada número de días I (con 0 <= I <= D) dice la probabilidad PI,J de que el estudiante repruebe la materia J si la estudia I días. Su algoritmo deberá encontrar cuántos días deberá de estudiar el estudiante cada una de sus M materias para minimizar la probabilidad de que repruebe todas sus materias. Por ejemplo, si M = 3, D = 4 y la tabla P dice que
P
0 días
1 día
2 días
3 días
4 días
Materia 1
0.8
0.7
0.65
0.62
0.6
Materia 2
0.75
0.7
0.67
0.65
0.62
Materia 3
0.9
0.7
0.6
0.55
0.5
entonces el estudiante deberá estudiar 1 día la materia 1, 0 días la materia 2 y 3 días la materia 3 (para una probabilidad de 0.7*0.75*0.55 = 0.28875). Escriba un programa llamado estudia basado en su algoritmo que acepte como entrada los enteros M y D y una tabla P de flotantes con M renglones y D+1 columnas como la descrita arriba y que escriba como salida la probabilidad pedida seguida de un vector de M enteros indicando cuántos días debe de estudiar cada una de las M materias. De nuevo, si la entrada fuera
3 4
0.8 0.7 0.65 0.62 0.6
0.75 0.7 0.67 0.65 0.62
0.9 0.7 0.6 0.55 0.5
entonces la salida podría ser 0.28875 1 0 3. Puede suponer que 1 <= M <= 10 y que 1 <= D <= 100. Nota: Use el tipo double para todos los flotantes y observe que puede haber más de una salida correcta.