Escolar Documentos
Profissional Documentos
Cultura Documentos
SCC211 Cap 11
SCC211 Cap 11
2011
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 1/53
Sumrio
Paradigmas de Resoluo de Problemas Busca Completa (backtracking ) Algoritmos diviso-e-conquista Algoritmos gulosos Programao Dinmica PD Exemplo
2/53
Os quatro paradigmas
Os quatro paradigmas de resoluo de problemas mais comumente usados em competies de programao so [3]:
1 2 3 4
3/53
Sumrio
Paradigmas de Resoluo de Problemas Busca Completa (backtracking ) Algoritmos diviso-e-conquista Algoritmos gulosos Programao Dinmica PD Exemplo
4/53
Algoritmos tentativa-e-erro
Um algoritmo tentativa-e-erro aquele que testa exaustivamente todas as solues possveis de um problema, de modo a obter a desejada, As solues so testadas indiscriminadamente:
No utiliza critrios para eliminar outras solues que no podero ser melhores que a obtida no estgio considerado.
As solues so enumeradas de modo semelhante ao percurso em uma rvore que possua todas as solues, Muitas vezes a rvore de solues cresce exponencialmente [8]!
5/53
Quando a pesquisa na rvore de solues cresce rapidamente necessrio usar algoritmos aproximados ou heursticas que no garantem a soluo tima mas so rpidas.
6/53
Algoritmos tentativa-e-erro
Exerccio:
Qual o menor caminho da cidade a at a c?
7/53
Algoritmos tentativa-e-erro
Exerccio:
TODOS os caminhos so enumerados:
a b c : 21 a b d c : 32 a b f d c : 51
8/53
Sumrio
Paradigmas de Resoluo de Problemas Busca Completa (backtracking ) Algoritmos diviso-e-conquista Algoritmos gulosos Programao Dinmica PD Exemplo
9/53
Algoritmos diviso-e-conquista
O paradigma diviso-e-conquista consiste em:
1
2 3
Dividir o problema a ser resolvido em subproblemas menores e independentes; Encontrar solues para as partes; Combinar as solues obtidas em uma soluo global.
10/53
Cada chamada de MaxMin4 atribui Max e Min o maior e o menor elemento em A[Linf ], A[Linf + 1], ..., A[Lsup].
11/53
Quando n = 2i para algum inteiro positivo i : f (n) 2f (n/2) 4f (n/4) . . . 2i 2 f (n/2i 2 ) = = = = 2f (n/2) + 2 4f (n/4) + 2 2 8f (n/8) + 2 2 2 . . . 2i 1 f (n/2i 1 ) + 2i 1
12/53
Logo, f (n) = 3n/2 2 para o melhor caso, pior caso e caso mdio (soluo tima).
13/53
Algoritmos diviso-e-conquista
Exemplos de algoritmos:
Busca binria; SelectionSort, MergeSorte, Quicksort; Maior elemento de uma sequncia; Fibonacci recursivo.
14/53
Sumrio
Paradigmas de Resoluo de Problemas Busca Completa (backtracking ) Algoritmos diviso-e-conquista Algoritmos gulosos Programao Dinmica PD Exemplo
15/53
Algoritmos gulosos
So tipicamente usados para resolver problemas de otimizao, Por exemplo, o algoritmo para encontrar o caminho mais curto entre duas cidades:
Um algoritmo guloso escolhe a estrada que parece mais promissora no instante atual e nunca muda essa deciso, independentemente do que possa acontecer depois.
A cada iterao:
seleciona um elemento conforme uma funo gulosa, marca-o para no consider-lo novamente nos prximos estgios, atualiza a entrada, examina o elemento selecionado quanto sua viabilidade, decide a sua participao ou no na soluo.
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 16/53
Algoritmos gulosos
17/53
Caractersticas da Implementao de Algoritmos Gulosos [8] Quando funciona corretamente, a primeira soluo encontrada sempre tima, A funo de seleo geralmente relacionada com a funo objetivo, Se o objetivo :
maximizar provavelmente escolher o candidato restante que proporcione o maior ganho individual, minimizar ento ser escolhido o candidato restante de menor custo.
Algoritmos gulosos
Exerccio:
Calcule o menor caminho da cidade a at a c , utilizando um algoritmo guloso.
20/53
PD Exemplo
Sumrio
Paradigmas de Resoluo de Problemas Busca Completa (backtracking ) Algoritmos diviso-e-conquista Algoritmos gulosos Programao Dinmica PD Exemplo
21/53
PD Exemplo
Introduo
Projetistas de algoritmos e programadores: escrever programas que achem a melhor soluo para todas as instncias dos problemas. relativamente fcil escrever um programa que fornea uma soluo decente e correta, mas assegurar que sempre ele retorna a melhor soluo... Programao Dinmica uma ferramenta geral muito poderosa para resolver problemas de otimizao em itens ordenados da esquerda para a direita, como as cadeias de caracteres. necessrio trabalhar com muitos exemplos para entender PD!
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 22/53
PD Exemplo
Programao Dinmica
Quando um algoritmo recursivo tem complexidade exponencial, a programao dinmica (PD) pode levar a um algoritmo mais eciente, A tcnica de programao dinmica consiste em dividir o problema original em subproblemas mais simples e resolv-los, armazenando os resultados em uma tabela, Isso feito iterativamente. A ideia bsica da programao dinmica construir por etapas uma resposta tima combinando respostas j obtidas para partes menores, Inicialmente, a entrada decomposta em partes mnimas, para as quais so obtidas respostas.
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 23/53
PD Exemplo
Programao Dinmica
Em cada passo, sub-resultados so combinados obtendo-se respostas para partes maiores, at que se obtenha uma resposta para o problema original, A decomposio feita uma nica vez e os casos menores so tratados antes dos maiores, Suas solues so armazenadas para serem usadas quantas vezes for necessrio.
24/53
PD Exemplo
Programao Dinmica
Estrutura geral da programao dinmica [6]:
25/53
PD Exemplo
Programao Dinmica
Reduz drasticamente o nmero total de vericaes pois evita aquelas que sabidamente no podem ser timas:
A cada passo so eliminadas subsolues que certamente no faro parte da soluo tima do problema.
26/53
PD Exemplo
Programao Dinmica
Considere o produto:
M = M1 [10, 20] M2 [20, 50] M3 [50, 1] M4 [1, 100]:
O produto na ordem M = M1 (M2 (M3 M4 )) requer 125.000 operaes; O produto na ordem M = (M1 (M2 M3 )) M4 requer 2.200 operaes.
27/53
PD Exemplo
Programao Dinmica
Resolver esse problema por tentativa e erro, isto , testar todas as ordens possveis de fazer o produto das matrizes para se obter qual a melhor (f (n)), um processo exponencial em n (f (n) 2n2 [1]). Usando programao dinmica possvel obter um algoritmo O(n3 )!
28/53
PD Exemplo
Programao Dinmica
Seja mij o menor custo para calcular o produto Mi Mi +1 ... Mj para 1 i j n, Assim, mij =
onde:
o termo mik representa o custo mnimo para calcular M = Mi Mi +1 ... Mk , o segundo termo mk +i ,j representa o custo mnimo para calcular M = Mk +1 Mk +2 ... Mj , o terceiro termo, bi 1 bk bj , representa o custo de multiplicar M [bi 1 , bk ] por M [bk , bj ], bi 1 bi so as dimenses da matriz Mi , a equao acima diz que mij , j > i , representa o custo mnimo de todos os valores possveis de k entre i e j 1, da soma dos trs termos.
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 29/53
PD Exemplo
Programao Dinmica
Seja mij o menor custo para calcular o produto Mi Mi +1 ... Mj para 1 i j n, Assim, mij = Min 0 se i = j Mini k j (mik + mk +1,j + bi 1 bk bj ) se j > i i k j
principio da otimalidade
Em uma sequncia tima de escolhas ou de decises, cada subsequncia tambm deve ser tima.
30/53
PD Exemplo
Programao Dinmica
Os valores mij so calculados na ordem crescente das diferenas nos subscritos, O clculo inicia com mii para todo i , depois mi ,i +1 para todo i , depois mi ,i +2 , ... Assim, esse mtodo chamado ascendente, ao contrrio dos mtodos recursivos, que so chamados descendentes.
31/53
PD Exemplo
Programao Dinmica
Hierarquia de instncias na programao dinmica [6]:
32/53
PD Exemplo
Programao Dinmica
Exerccio: Escrever um algoritmo para achar o produto de menor custo entre n matrizes, usando programao dinmica.
33/53
PD Exemplo
Programao Dinmica
#define Maxn 10 int main(int argc, char *argv[]) { int i, j, k, h, n, temp; int b[Maxn+1]; int m[Maxn][Maxn]; printf(Numero de matrizes n: ); scanf(%d, &n); getchar(); printf(Dimensoes das matrizes: ); for (i = 0; i <= n; i++) scanf(%d, &b[i]); for (i = 0; i < n; i++) m[i][i] = 0; for (h = 1; h <= n-1; h++) { for (i = 1; i <= n-h; i++) { j = i+h; m[i-1][j-1] = INT_MAX; for (k = i; k <= j-1; k++) { temp = m[i-1][k-1] + m[k][j-1] + b[i-1] * b[k] * b[j]; if (temp < m[i-1][j-1]) m[i-1][j-1] = temp; } printf(m[%d][%d] = %d\n, i-1, j-1, m[i-1][j-1]); } putchar(\n); } return 0; } Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica
34/53
PD Exemplo
Sumrio
Paradigmas de Resoluo de Problemas Busca Completa (backtracking ) Algoritmos diviso-e-conquista Algoritmos gulosos Programao Dinmica PD Exemplo
35/53
PD Exemplo
36/53
PD Exemplo
PD Exemplo
38/53
PD Exemplo
Output:
For each test case output the minimal amount of fuel used ying from your current position (at altitude 0) to X (also at altitude 0), followed by a blank line.
39/53
PD Exemplo
Sample Output
120 354 Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 40/53
PD Exemplo
41/53
M ti ti Motivation
Howtosolvethis:10337 (FlightPlanner)?
Unit:1milealtitudeand 1(x100)milesdistance Givenwindspeedmap Fuel F lcost: t {climb li b (+60), ( 60) hold (+30),sink (+20)} windspeedwsp[alt][dis] Computemin fuelcost from(0,0)to(0,X=4)!
1 1 1 1 | 9 1 1 1 1 | 8 1 1 1 1 | 7 1 1 1 1 | 6 1 1 1 1 | 5 1 1 1 1 | 4 1 1 1 1 | 3 1 1 1 1 | 2 1 9 9 1 | 1 1 -9 -9 1 | 0 ======================== 0 1 2 3 4 (x100)
Answeroftheproblemisfuel(0,0)
CS3233 CompetitiveProgramming, StevenHalim,SoC,NUS
Solution2
1 1 1 1 | 9 1 1 1 1 | 8 1 1 1 1 | 7 1 1 1 1 | 6 1 1 1 1 | 5 1 1 1 1 | 4 1 1 1 1 | 3 1 1 1 1 | 2 1 9 9 1 | 1 1 -9 -9 1 | 0 ======================== 0 1 2 3 4 (x100) 29+ 39+ 69+ 19=156
Solution4
1 1 1 1 | 9 1 1 1 1 | 8 1 1 1 1 | 7 1 1 1 1 | 6 1 1 1 1 | 5 1 1 1 1 | 4 1 1 1 1 | 3 1 1 1 1 | 2 1 9 9 1 | 1 1 -9 -9 1 | 0 ======================== 0 1 2 3 4 (x100) 59+ 11+ 39+ 29=138
Solution6
1 1 1 1 | 9 1 1 1 1 | 8 1 1 1 1 | 7 1 1 1 1 | 6 1 1 1 1 | 5 1 1 1 1 | 4 1 1 1 1 | 3 1 1 1 1 | 2 1 9 9 1 | 1 1 -9 -9 1 | 0 ======================== 0 1 2 3 4 (x100) 59+ 21+ 11+ 29=120(OPT)
Solution8
1 1 1 1 | 9 1 1 1 1 | 8 1 1 1 1 | 7 1 1 1 1 | 6 1 1 1 1 | 5 1 1 1 1 | 4 1 1 1 1 | 3 1 1 1 1 | 2 1 9 9 1 | 1 1 -9 -9 1 | 0 ======================== 0 1 2 3 4 (x100) 59+ 51+ 19+ 19=148
INF
0 0 1 2
CS3233 CompetitiveProgramming, StevenHalim,SoC,NUS
Overlappingsubproblems
Numberofdistinctsubproblemsareactuallysmall small Buttheyarerepeatedlycomputed
ThisisdifferentfromDivideandConquer
1 1 1 0
1 1 1 1
1 1 2
1 0
40 19 29 0 3 4
Createa2Dtableofsize10*(X/100)
Save Space!
Set1forunexploredsubproblems(memset) Storethecomputationvalueofsubproblem
2
Simplyreusewhen itisneededagain!
INF
0 0 1 2
CS3233 CompetitiveProgramming, StevenHalim,SoC,NUS
TopDown(Demo):
Recursionaspernormal+memoizationtable
Itisjustasimplechangefrombacktracking (completesearch)solution!
Thenfillinthetableusingloops!
BothDPvariantsusetable!
Vi li ti Visualization
fuel(alt, min3(20 30 60 dis) = - wsp[alt + 1][dis - 1] + fuel(alt + 1, dis - 1), - wsp[alt ][dis - 1] + fuel(alt , dis - 1), - wsp[alt - 1][dis - 1] + fuel(alt - 1, dis - 1))
2 1 0
0 0
59 29 1 2
110
0 0
1 1 1 1 | 9 1 1 1 1 | 8 1 1 1 1 | 7 1 1 1 1 | 6 1 1 1 1 | 5 1 1 1 1 | 4 1 1 1 1 | 3 1 1 1 1 | 2 1 9 9 1 | 1 1 -9 -9 1 | 0 ======================== 0 1 2 3 4 (x100)
Tips: (on-the-fly)
We can reduce one storage dimension by only keeping 2 recent columns at a time But the time p y is complexity unchanged: O(10 * X / 100)
1 0
59 80 29 68 1 2 3 4
2 1 0
0 0
110 131
59 80 101 29 68 91 1 2 3 4
2 1 0
0 0
110 131
59 80 101 29 68 91 120 1 2 3 4
BottomUp
Pro:
Fasterifmanysub problemsarevisited: norecursivecalls! Cansavememoryspace^
Cons:
Sloweriftherearemany subproblemsdueto recursivecalloverhead UseexactlyO(states) tablesize( (MLE?) )
Cons:
Notsointuitive? IfthereareXstates, b tt upvisits/fills bottom i it /fill th the valueofalltheseXstates
Demo
2 1 0
0 0
110 131
59 80 101 29 68 91 120 1 2 3 4
Apndice
42/53
Apndice
Apndice
Input
The input will contain several instances, one per line. Each line will start with a number 1 n 250, indicating the size of S . Following n, in the same line, there will be n non-negative integers representing the query frequencies of the elements of S : f (e1 ), f (e2 ), ..., f (en ). 0 f (ei ) 100. Input is terminated by end of le.
Output
For each instance of the input, you must print a line in the output with the total cost of the Optimal Binary Search Tree.
44/53
Apndice
Sample Input
1 5 3 10 10 10 3 5 10 20
Sample Output
0 20 20
45/53
Apndice
Vampires (11500)
The Problem
Felipinho is thrilled with his new RPG game, about wars between clans of vampires. In this game he plays a vampire that repeatedly comes into combat against vampires from other clans. Such battles are won or lost based on some characteristics of the opponents, with the help of a standard six-faced dice. For simplicity, we will consider only the ght between two vampires, Vampire 1 and Vampire 2. Each vampire has a vital energy (denoted respectively by EV1 and EV2 ). Besides, an attack force AT and a damage capacity D are also given.
46/53
Apndice
Vampires (11500)
The Problem (cont.)
The combat is fought in turns, in the following way. At each turn, the dice is rolled; if the result value is less than or equal to AT , Vampire 1 wins the turn, otherwise Vampire 2 wins. The winner then sucks the value D from the losers vital energy. That is, D points are subtracted from the losers vital energy and added to the winners vital energy. The combat continues until one of the ghters has EV less than or equal to zero. For example, suppose EV1 = 7, EV2 = 5, AT = 2 and D = 4. The dice is rolled and the result value is 3. Then, Vampire 2 wins the turn, and therefore 4 points are subtracted from EV1 and added to EV2 . The new values for the vital energies would be EV1 = 3 and EV2 = 9. Notice that, if in the next turn Vampire 2 wins again, the combat ends.
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 47/53
Apndice
Vampires (11500)
48/53
Apndice
Vampires (11500)
The Input
The input contains several test cases. Each test case is given in one single line, containing four integers EV1 , EV2 , AT and D separated by spaces (1 EV1 , EV2 10, 1 AT 5 and 1 D 10). The end of input is indicated by one line containing only four zeros, separated by spaces.
The Output
For each test case in the input, your program must print a single line. The line must contain a real number representing, in terms of percentages, the probability that Vampire 1 wins the combat. The result must be printed as a real number with exactly one decimal gure.
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 49/53
Apndice
Vampires (11500)
Sample Input
1 1 8 7 0 1 2 5 5 0 3 1 3 2 0 1 1 1 4 0
Sample Output
50.0 3.2 61.5 20.0
50/53
Apndice
Referncias I
[1] Aho, A. V., Hopcroft. J. E., Ullman, J. D. The Design and Analysis of Computer Algorithms. Addison-Wesley, 1974. [2] Cormen, T. H., Leiserson, C. E., Rivest, R. L., Stein, C. Algoritmos - Teoria e Prtica. Ed. Campus, Rio de Janeiro, Segunda Edio, 2002. [3] Halim, S., Halim, F. Competitive Programming - Increasing the Lower Bound of Programming Contests. Lulu, 2010.
51/53
Apndice
Referncias II
[4] Halim, S. CS3233 - Competitive Programming - Week 04 Problem Solving Paradigms (Dynamic Programming 1) Supporting Material - Competitive Programming: http://sites.google.com/site/stevenhalim/ home/material [5] Horowitz, E., Sahni, S. Rajasekaran, S. Computer Algorithms. Computer Science Press, 1998. [6] Munari Junior, Pedro Augusto Paradigmas e Tcnicas de Projeto de Algoritmos. SCE-181 Introduo Cincia da Computao II. Slides. Cincia de Computao. ICMC/USP, 2007.
Joo Lus G. Rosa c 2011 - SCC-211: XI. Programao Dinmica 52/53
Apndice
Referncias III
[7] Skiena, Steven S.; Revilla, Miguel A. Programming Challenges - The Programming Contest Training Manual - chapter 11. Springer, 2003. [8] Ziviani, Nivio Projeto de Algoritmos - com implementaes em Java e C++. Thomson, 2007.
53/53