Aquest exercici explora l’ús de vectors per resoldre problemes de programació dinàmica.
Oh, no... Un altre cop! Feu una funció
fib :: Int -> Integer que, donat un
,
retorni
l’-èsim
nombre de Fibonaci.
Feu una funció
binomial :: Int -> Int -> Integer que, donat un enter
i un enter
,
retorni el coeficient binomial
,
és a dir, el nombre de formes en què es poden escollir
objectes d’entre un conjunt de
sense tenir en compte l’ordre.
Feu una funció bst :: Int -> Integer que, donat
un
,
retorni el nombre d’arbres binaris de cerca amb nodes
.
Per exemple, bst 3 és 5, perquè hi ha 5 arbres binaris
de cerca amb nodes 1,2,3:
1 1 2 3 3
\ \ / \ / /
2 3 1 3 1 2
\ / \ /
3 2 2 1
Feu una funció coins :: [Int] -> Int -> Int
que, donada una llista de
valors de monedes
i donat un valor
,
trobi el mínim nombre de monedes que sumen
.
Cada moneda es pot fer servir diversos (o cap) cops,
i
per a tot
.
Donades dues matrius amb dimensions i , el cost de l’algorisme habitual per multiplicar-les és . Per senzillesa, considerem que el cost és exactament .
Suposem que hem de calcular , on cadascuna de les és una matriu amb dimensions . Com que el producte de matrius és associatiu, es pot triar en quin ordre es fan les multiplicacions. Per exemple, per calcular , es podria fer , amb cost , o bé , amb cost , o bé tres altres ordres possibles.
Feu una funció mult :: [Int] -> Int que trobi el cost
mínim de calcular
,
donades les dimensions
.
Per a cada apartat, hi ha dos tipus de jocs de proves segons la talla de la seva entrada: els petits i els grans. Els petits es poden resoldre recursivament i dónen 5 punts cadascún. Els grans requereixen programació dinàmica i dónen 15 punts cadascún.
Input
map fib [0..6] map (binomial 6) [0..6] map bst [0..6] coins [1,3,5] 11 coins [4,6] 11 mult [10,20,30,40] mult [9000,4000,3500,8000,2000,7500,6000,1000,8500,5500,7000]
Output
[0,1,1,2,3,5,8] [1,6,15,20,15,6,1] [1,1,2,5,14,42,132] Just 3 Nothing 18000 302250000000