Динамическое программирование-алгоритм paint fence
есть забор с n сообщения, каждый пост может быть окрашен одним из k цвета. Вы должны покрасить все столбы так, чтобы не более двух соседних столбов забора имели одинаковый цвет. Верните общее количество способов, которыми вы можете покрасить забор.
diff - количество комбинаций с разными цветами,
то же самое - количество комбинаций с одинаковыми цветами,
n - количество сообщения,
k - количество цветов.
для n = 1:
diff = k;
same = 0;
для n = 2:
diff = k * (k - 1);
same = k;
для n = 3:
diff = (k + k * (k - 1)) * (k - 1);
same = k * (k - 1);
и последняя формула:
same[i] = diff[i - 1];
diff[i] = (diff[i - 1] + diff[i - 2]) * (k - 1);
Я понимаю, как найти same[i]
, но я не понимаю, как найти diff[i]
. Можете ли вы объяснить формулу для diff[i]
?
2 ответов
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])
вот аргумент комбинаторики.
пусть diff[i, c]
быть количество способов рисовать i
посты по правилам постановки задачи такие, что последний забор окрашивается в цвет c
.
у нас есть:
diff[i, c] = diff[i - 1, c'] + diff[i - 2, c''], c' != c OR c'' != c
для каждого c
которым мы пишем i
, предыдущий может заканчиваться на c' != c
(в этом случае нам все равно, что второе предыдущее), или второе предыдущее может закончиться c'' != c
(в этом случае нам все равно, что предыдущее), или и то, и другое.
здесь k - 1
возможности c' != c
и k - 1
на c'' != c
. Так что мы можем упасть c
от повторения и просто напишите:
diff[i] = (k - 1) * (diff[i - 1] + diff[i - 2])
что у вас есть.