2015-09-07 13 views
5

Es gibt einen Zaun mit n Beiträge, jeder Beitrag kann mit einer der k Farben gemalt werden. Sie müssen alle Pfosten so malen, dass nicht mehr als zwei benachbarte Zaunpfosten die gleiche Farbe haben. Gibt die Gesamtzahl der Möglichkeiten zurück, mit denen Sie den Zaun malen können.Dynamische Programmierung - Farbe Zaun Algorithmus

diff - Anzahl von Kombinationen mit verschiedenen Farben,
gleiche - Anzahl von Kombinationen mit gleichen Farben,
n - Anzahl der Beiträge,
k - Anzahl der Farben.

Für n = 1:

diff = k; 
same = 0; 

Für n = 2:

diff = k * (k - 1); 
same = k; 

Für n = 3:

diff = (k + k * (k - 1)) * (k - 1); 
same = k * (k - 1); 

und die endgültige Formel:

same[i] = diff[i - 1]; 
diff[i] = (diff[i - 1] + diff[i - 2]) * (k - 1); 

Ich verstehe, wie man same[i] findet, aber ich verstehe nicht, wie man diff[i] findet. Können Sie die Formel für diff[i] erklären?

Antwort

8
total[i] = diff[i] + same[i] (definition) 

diff[i] = (k - 1) * total[i-1] 
     = (k - 1) * (diff[i-1] + same[i-1]) 
     = (k - 1) * (diff[i-1] + diff[i-2]) 
4

Hier ist ein kombinatorisches Argument.

Lassen Sie diff[i, c] die Anzahl der Möglichkeiten sein, i Beiträge nach den Regeln der Problemstellung zu malen, so dass der letzte Zaun mit Farbe c lackiert wird.

Wir haben:

diff[i, c] = diff[i - 1, c'] + diff[i - 2, c''], c' != c OR c'' != c 

Für jede c wir i malen mit der vorherigen entweder mit einem c' != c enden kann (in diesem Fall werden wir interessiert nicht, was die zweite vorherigen ist) oder der zweite vorherige kann mit einer c'' != c enden (in diesem Fall ist uns egal, was der vorherige ist), oder beides.

Es gibt k - 1 Möglichkeiten für c' != c und k - 1 für c'' != c. So können wir c aus der Wiederholung fallen und einfach schreiben:

diff[i] = (k - 1) * (diff[i - 1] + diff[i - 2]) 

Welche ist das, was Sie haben.

+0

kleiner Tippfehler in der Formel, der zweite Diff [i-1] sollte diff sein [i-2] – user908645

+1

Sehr erzieherische Erklärung. Hätte ich diese Frage im Interview genommen, würde ich wahrscheinlich diese Argumentation machen: 1) Die letzten 2 Beiträge haben die gleiche Farbe, daher können die letzten 2 Beiträge nicht wie die letzten 3 gemalt werden. (k-1) * diff [n-2] 2) Die letzten 2 Beiträge haben unterschiedliche Farben. (k-1) * diff [n-1] Zusammen ergeben sie (k-1) * (diff [n-2] + diff [n - 1]) – user908645

Verwandte Themen