Diferente pentru probleme-de-acoperire-2 intre reviziile #35 si #36

Nu exista diferente intre titluri.

Diferente intre continut:

(Categoria _Algoritmi_, autor _Cosmin Negruşeri_)
(toc){width: 33em}*{text-align:left} *Cuprins:*
* 'Problema 1 ( _MagicBoxes_ ) ':probleme-de-acoperire2#prob1
* 'Problema 2 ( _IOI 2001 Pavement_, [1] ) ':probleme-de-acoperire2#prob2
* 'Problema 3 ( _ACM ICPC 1997_ ) ':probleme-de-acoperire2#prob3
* 'Problema 4 ( _Hardwood Floor_ ) ':probleme-de-acoperire2#prob4
* 'Problema 5 ( _TopCoder, CaseysArt_ ) ':probleme-de-acoperire2#prob5
* 'Problema 6 ( _Another chocolate maniac_ ) ':probleme-de-acoperire2#prob6
* 'Problema 7 ( _Bugs, CEOI 2002_, [2] ) ':probleme-de-acoperire2#prob7
* 'Problema 8 ( _CSP 1993, Lot 2001, Domino, IPSC 2004, Algoritmus 2005, IOI 2005_ ) ':probleme-de-acoperire2#prob8
* 'Aplicaţii':probleme-de-acoperire2#app
* 'Bibliografie':probleme-de-acoperire2#biblio
* 'Problema 1 ( _MagicBoxes_ ) ':probleme-de-acoperire-2#prob1
* 'Problema 2 ( _IOI 2001 Pavement_, [1] ) ':probleme-de-acoperire-2#prob2
* 'Problema 3 ( _ACM ICPC 1997_ ) ':probleme-de-acoperire-2#prob3
* 'Problema 4 ( _Hardwood Floor_ ) ':probleme-de-acoperire-2#prob4
* 'Problema 5 ( _TopCoder, CaseysArt_ ) ':probleme-de-acoperire-2#prob5
* 'Problema 6 ( _Another chocolate maniac_ ) ':probleme-de-acoperire-2#prob6
* 'Problema 7 ( _Bugs, CEOI 2002_, [2] ) ':probleme-de-acoperire-2#prob7
* 'Problema 8 ( _CSP 1993, Lot 2001, Domino, IPSC 2004, Algoritmus 2005, IOI 2005_ ) ':probleme-de-acoperire-2#prob8
* 'Aplicaţii':probleme-de-acoperire-2#app
* 'Bibliografie':probleme-de-acoperire-2#biblio
Subiectul acestui articol sunt acoperirile cu o abordare bazată pe tehnici de programare. În "$...secţiunea precedentă$":probleme-de-acoperire am studiat problemele de acoperire care nu necesită cunoştinţe avansate de algoritmi.
bq. Se dă o matrice de dimensiuni $N x M (1 <= N <= 7 şi 1 <= M <= 100)$. Unele celule ale acestei matrici sunt distruse şi trebuie acoperite cu piese de forma din $Fig. 1$. Fiecare celulă rămasă neacoperită se consideră o greşeală, iar dacă o piesă cu care am acoperit celule distruse a trebuit să fie tăiată pentru a acoperi numai celule distruse, fiecare pătrăţel din partea nefolosită a piesei este considerată o greşeală. Se cere acoperirea tablei astfel ca numărul de greşeli să fie minimizat. În $Fig. 2$, pentru prima tablă, acoperirea optimă are două greşeli, aşa cum vedem în al doilea desen.
p=. _Fig. 1_ !probleme-de-acoperire2?P221.jpg!       _Fig. 2_ !probleme-de-acoperire2?P222.jpg!
p=. _Fig. 1_ !probleme-de-acoperire-2?P221.jpg!       _Fig. 2_ !probleme-de-acoperire-2?P222.jpg!
h3. Soluţie:
Construim soluţia optimă coloană cu coloană, dar este evident din următorul exemplu că pentru a construi soluţia optimă pentru coloana $j + 1$ nu este de ajuns să acoperim optim primele $j$ coloane.
p=. !probleme-de-acoperire2?P223.jpg!
p=. !probleme-de-acoperire-2?P223.jpg!
Evident soluţia optimă pe primele trei coloane ale tablei foloseşte piesa în formă de cruce şi se obţine o acoperire cu $0$ greşeli, dar când vrem să acoperim toate $4$ coloanele tablei folosind prima acoperire obţinem o tablă cu $2$ greşeli, iar folosind două piese de tipul doi orientate înspre stânga, obţinem o acoperire cu o singură greşeală.
Pentru a obţine o soluţie cu $j + 1$ coloane ne trebuie toate soluţiile cu $j$ coloane la care ştim configuraţia coloanelor $j – 1$ şi $j$ (o piesă poate influenţa configuraţia a cel mult trei coloane). De aici se conturează ideea de a folosi un tablou $best$ unde $best[j][config1][config2]$ conţine numărul minim de greşeli astfel încât coloana $j$ are pătratele rămase neacoperite date de mulţimea $config1$, iar coloana $j - 1$ are pătratele neacoperite date de mulţimea $config2$. Pentru a trece de la $j$ la $j + 1$, facem un $backtracking$ pe o tablă de trei coloane dintre care prima are pătrăţelele ocupate date de $config2$, a doua pătrăţelele ocupate date de $config1$, iar a treia nu are nici un pătrăţel ocupat. După ce am plasat în procedura $backtraking$ nişte piese ajungem la configuraţiile pentru coloane date de mulţimile $c1 c2 c3$ şi actualizăm dacă am obţinut un număr mai mic pe $best[j + 1][c3][c2]$. În procedura recursivă ţinem cont atunci când vom acoperi cu piese un pătraţel deja acoperit sau un pătraţel ce nu este stricat. Ambele mulţimi $config1$ şi $config2$ pot fi reprezentate cu biţii unui întreg, $N$ fiind mic, astfel: primii $7$ biţi ai unui întreg vor reprezenta elementele primei mulţimi iar următorii $7$ biţi elementele celei de a două mulţimi. Memoria folosită de algoritmul nostru are ordinul de complexitate $O(M * 4^N^)$, acesta putând fi uşor micşorat la $O(4^N^)$ pentru că la pasul $j + 1$ avem nevoie numai de linia $j$ a matricii. Pentru a reduce numărul de stări folosite ne vom folosi de observaţia că putem să facem o restricţie asupra acoperirilor, aceea că atunci când ajungem la coloana $j$ orice piesă nouă amplasată trebuie să acopere cel puţin un pătrăţel neacoperit de pe coloana $j – 1$. Fie $newBest[j][confing12]$ structura care păstrează cele mai bune acoperiri cu această restricţie, atunci soluţia optimă va fi în $newBest[M + 1]$ unde am considerat o nouă coloană $M + 1$ a tablei ce nu are niciun pătrăţel stricat. Pentru tablele astfel acoperite, configuraţiile ultimelor două pătrăţele de pe o linie sunt de forma: $11$ şi $10$ şi $00$, configuraţia $01$ nu apare pentru că este evident că nu există o piesă care să acopere un pătrat din ultima coloană, un pătrat cu două coloane înainte şi să nu acopere pătratul imediat în stânga pătratului de pe ultima linie. Astfel avem $O(3^N^)$ configuraţii posibile pentru ultimele două coloane. Mai există multe configuraţii de două coloane la care nu se poate ajunge folosind piesele din problemă, dar o analiză exactă ar fi dificilă şi probabil ar complica inutil implementarea. Să vedem cum arată configuraţiile pe un exemplu:
p=. !probleme-de-acoperire2?P224.jpg!
p=. !probleme-de-acoperire-2?P224.jpg!
Putem reprezenta această acoperire astfel:
O soluţie care ne va da numărul exact şi ar fi putut fi folosită în concurs este asemănătoare celei expuse mai sus. Vom folosi o combinaţie a metodei $backtracking$ cu metoda $programării dinamice$. Tabloul $numWays[i][config]$ va fi numărul de posibilităţi de a acoperi complet primele $i - 1$ coloane ale unei table, iar pe coloana $i$ pătratele ocupate sunt reprezentate de mulţimea $config$. Astfel, $numWays[i + 1][config1]$  va fi egal cu suma de $numWays[i][config]$ unde putem acoperi cu dominouri două coloane astfel ca pe prima coloană să nu fie acoperite celulele date de $config$ şi pe a doua coloană să fie acoperite celulele date de $config1$. De exemplu, starea dată de $(4, 100100)$ este prezentată în următoarea figură:
p=. !probleme-de-acoperire2?P231.jpg!
p=. !probleme-de-acoperire-2?P231.jpg!
Dacă procedura aşezăm trei dominouri pe linia $4$ şi linia $5$ aşa cum vedem mai sus, atunci vom trece în starea $(5, 011000)$. La final, vom returna valoarea aflată în $numWays[N + 1][&#48;]$. Complexitatea ca timp a acestei rezolvări este $O(M * 4^N^)$, iar ca spaţiu este $O(2^N^)$.
bq. Determinaţi numărul de moduri în care poate fi acoperit un dreptunghi de dimensiuni $N x M (N <= 18, M <= 15)$ cu piese de forma:
p=. !probleme-de-acoperire2?P251.jpg!
p=. !probleme-de-acoperire-2?P251.jpg!
h3. Soluţie:
De exemplu, pentru $N = 3, M = 4$ avem următoarele acoperiri:
p=. !probleme-de-acoperire2?P252.jpg!
p=. !probleme-de-acoperire-2?P252.jpg!
Din nou, ideea de rezolvare este cea prezentată în $Problema 2$. Complexitatea soluţiei este $O(N * 4^M^)$, dar trebuie să fim conştienţi că aceasta este o limită superioară mult mai mare decât complexitatea reală. Să vedem şi implementarea unei asemenea soluţii:
bq. Se dă o tablă de dimensiuni $M x N (1 <= M <= 70, 1 <= N <= 7)$ cu unele pătrate lipsă. Se cere numărul minim de dominouri ce pot fi plasate pe tablă fară să se sprapună între ele, sau să acopere vreun pătrat ce nu aparţine tablei, astfel ca nici o altă piesă de domino să nu se poată adăuga la configuraţie fără ca aceasta să se suprapună peste una veche. Pentru tabla următoare vedem uşor în a doua figură că soluţia optimă va conţine 4 dominouri.
p=. !probleme-de-acoperire2?P261.jpg!
p=. !probleme-de-acoperire-2?P261.jpg!
h3. Soluţie:
bq. Să se acopere o tablă de dimensiuni $M x N (1 <= M <= 10, 1 <= N <= 150)$ cu un număr maxim de piese de dimensiuni $3 x 2$ şi $2 x 3$. Tabla are unele celule ce trebuie să nu fie acoperite, iar oricare două piese nu se pot suprapune. Pentru tabla de mai jos, numărul maxim de piese cu care se poate acoperi este $3$.
p=. !probleme-de-acoperire2?P272.jpg!
p=. !probleme-de-acoperire-2?P272.jpg!
h3. Soluţie:
Evident, putem încerca o soluţie identică cu cea a '$Problemei 1$':probleme-de-acoperire2#prob1, dar aici limitele sunt puţin mai mari şi avem nevoie de un algoritm mai eficient.
Evident, putem încerca o soluţie identică cu cea a '$Problemei 1$':probleme-de-acoperire-2#prob1, dar aici limitele sunt puţin mai mari şi avem nevoie de un algoritm mai eficient.
Există o rezolvare de complexitate $O(N * M * 3^M^)$ care aşa cum deja v-aţi obişnuit combină metoda $backtracking$ cu metoda $programării dinamice$. Folosim un tablou $max[N][M + 1][3^(M + 1)^]$ care conţine numărul maxim de dale puse pentru o anumită stare. Fiecare element al matricii va avea iniţial $max[i][j][config]$ egal cu $0$. Iterăm rândurile în ordinea $1 .. N$, coloanele în ordinea $1 .. M$ şi configuraţiile în ordine lexicografică. Când vom procesa starea reprezentată de parametrii $(i, j, config)$ vom decide dacă punem una dintre piese cu colţul de stânga sus în $(i, j)$ sau dacă lăsăm celula $(i, j)$ liberă. O stare $(i, j, config)$ se referă la un pătrăţel din matrice şi la o bandă „activă” de pătrăţele ce are lăţimea $2$. Banda conţine celulele $(i1, j + 1), (i1, j + 2)$ pentru $i1 < i$ şi celulele $(i2, j), (i2, j + 1)$ pentru $i <= i2$. Cifrele în baza $3$ ale parametrului $config$ ne spun starea perechilor de pătrate de pe banda activă: $00$ este reprezentat în $config$ de cifra $0$, $10$ de cifra $1$ şi $11$ de cifra $2$ (configuraţia $01$ nu poate apărea). De exemplu, starea $(4, 3, 1000212)$ va reprezenta configuraţia prezentată în următoarea imagine (ultima cifră corespunde primei perechi de pătrăţele, penultima cifră celei de a doua perechi şamd):
p=. !probleme-de-acoperire2?P273.jpg!
p=. !probleme-de-acoperire-2?P273.jpg!
Dacă decidem să nu punem piesă în pătrăţelul $(4, 3)$ atunci din starea $(4, 3, 1000212)$ trecem în starea $(5, 3, 10000212)$.
p=. !probleme-de-acoperire2?P274.jpg!
p=. !probleme-de-acoperire-2?P274.jpg!
Dacă punem o piesă verticală ajungem în starea $(7, 3, 1111212)$.
p=. !probleme-de-acoperire2?P275.jpg!
p=. !probleme-de-acoperire-2?P275.jpg!
Iar dacă punem o piesă orizontală atunci ajungem în starea $(6, 3, 1022212)$.
p=. !probleme-de-acoperire2?P276.jpg!
p=. !probleme-de-acoperire-2?P276.jpg!
Tablei îi adăugăm la sfârşit o coloană pe care nu pot fi aşezate piese. Rezultatul cerut de problemă se va afla în $max[N][M + 1][&#48;]$. Menţionăm că $Problemele$ '$2$':probleme-de-acoperire2#prob2, '$3$':probleme-de-acoperire2#prob3 şi '$4$':probleme-de-acoperire2#prob4 pot fi rezolvate în mod asemănător în complexitate $O(N * M * 2^M^)$.
Tablei îi adăugăm la sfârşit o coloană pe care nu pot fi aşezate piese. Rezultatul cerut de problemă se va afla în $max[N][M + 1][&#48;]$. Menţionăm că $Problemele$ '$2$':probleme-de-acoperire-2#prob2, '$3$':probleme-de-acoperire-2#prob3 şi '$4$':probleme-de-acoperire-2#prob4 pot fi rezolvate în mod asemănător în complexitate $O(N * M * 2^M^)$.
h2(#prob8). Problema 8 ( _CSP 1993, Lot 2001, "Domino":http://acm.sgu.ru/problem.php?contest=0&problem=101, "The Tiling Problem":http://ipsc.ksp.sk/contests/ipsc2004/practice/problems/t.php, Algoritmus 2005, IOI 2005_ )
bq. Se dă o tablă de dimensiuni $N x M$, din care unele pătrate sunt eliminate. Se cere să se determine o acoperire a tablei cu număr maxim de dominouri $(1 <= N, M <= 200)$. De exemplu, o tablă ce nu are nicio celulă eliminată, de $3 x 3$ pătrăţele, poate fi acoperită cu cel mult $4$ dominouri care nu se suprapun. O soluţie posibilă este prezentată în a doua figură.
p=. !probleme-de-acoperire2?P281.jpg!
p=. !probleme-de-acoperire-2?P281.jpg!
h3. Soluţie:
Prima idee ar fi să încercăm o abordare $greedy$ în care încercăm într-o ordine oarecare să punem piese pe tablă cât timp mai este loc, dar putem găsi uşor contraexemple pentru acest tip de abordare. Limitele sunt mult prea mari pentru ca o rezolvare bazată pe $programare dinamică$ combinată cu $backtraking$ să meargă. O idee ce am utilizat-o în numărul anterior ne va fi folositoare aici. Colorăm tabla noastră în mod asemănător unei table de şah şi numerotăm pătrăţelele tablei.
p=. !probleme-de-acoperire2?P282.jpg!
p=. !probleme-de-acoperire-2?P282.jpg!
Acum vedem că un domino poate fi amplasat pe tablă şi el trebuie să ocupe o celulă colorată alb şi una negru, celule care sunt adiacente. Dacă realizăm un graf în care nodurile sunt celulele iar între două noduri există muchie dacă ele sunt adiacente vertical sau orizontal pe tablă, facem observaţia că graful este bipartit. O acoperire cu dominouri corespunde în acest graf unei mulţimi de muchii pentru care nu există două muchii cu acelaşi capăt (o muchie corespunde amplasării posibile a unui domino, iar restricţia menţionată face ca să nu existe dominouri care se suprapun). Deci pentru a găsi o soluţie maximală pentru problema iniţială, trebuie să găsim o mulţime de muchii de cardinal maxim. În acest mod am transformat cerinţa într-o problemă clasică de teoria grafurilor cunoscută sub numele de '$cuplaj maxim într-un graf bipartit$':usaco-ian-2005-divizia-gold#cover. Vedem în imaginea următoare cum a fost transformată tabla într-un graf şi cum soluţia prezentată în exemplu corespunde unui $cuplaj maxim$ în graful asociat tablei.
p=. !probleme-de-acoperire2?P283.jpg!
p=. !probleme-de-acoperire-2?P283.jpg!
h2(#app). Aplicaţii

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.