Динамическое программирование-алгоритм 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])

что у вас есть.