[python] Примечания к динамическому программированию [2] Последовательное динамическое программирование

Последовательное динамическое программирование

Вставьте описание изображения сюда
Шаг 1: Определите состояние
· Оптимальной стратегией является стратегия с наименьшими затратами
· Последний шаг: В стратегии с наименьшими затратами дом N-1 должен быть окрашен в один
из трех цветов: красный, зеленый и синий · но два соседних дома не могут быть окрашены в один и тот же цвет
· Если вы примените предыдущую идею, запишите минимальную стоимость первых N домов. В соответствии с порядком вы также должны указать минимальную стоимость первых N-1 домов. в первых домах N-1 нет. Знайте, какого цвета дом N-2, поэтому он может столкнуться с домом N-1.
· ** Итак, -> Я не знаю, какого цвета дом N-2, просто запишите. ** Запишите отдельно дома N-1 перед покраской, а дома N-2 - это минимальная стоимость красного, синего и зеленого цветов.

Подзадача: Найдите минимальную стоимость N домов перед покраской и дом N-1 красного, синего и зеленого цветов.
Статус: предположим, что дом i до окраски, а дом i-1 красный, синий и зеленый. Минимальные затраты: f [i] [0], f [i] [1], f [i] [2].
Вставьте описание изображения сюда
Вставьте описание изображения сюда

Решение такое:

class Solution:
    def calculate(self, N, cost):
		#red指第N个房子为红的情况,blue、green同理
        red, blue, green = cost[0][0], cost[0][1], cost[0][2]
        for i in range(1, N):
            red,blue,green = min(blue + cost[i][0], green + cost[i][0]),min(red + cost[i][1], green + cost[i][1]), min(red + cost[i][2], blue + cost[i][2])
        return min(red, blue, green)

Резюме:
1. Последовательное динамическое программирование:… сначала i… минимум / количество способов / осуществимость
2. Если используется только f (N-1), он не сможет различить.
3. Решение: запишите ситуацию N- 2


Вставьте описание изображения сюда
Определите статус:
· Расшифрованная числовая строка делится на несколько сегментов, каждый сегмент соответствует букве
· Последний шаг (последний сегмент) соответствует букве
· Эта буква становится 1, 2 ... или 26 при шифровании,
Вставьте описание изображения сюда
Вставьте описание изображения сюда
поэтому метод дешифрования должен быть 100 + 50 видов ————

** Получить подвопрос -> ** Знайте, как расшифровать первые N-1 и первые N-2 символа числовой строки

Получите уравнение состояния: предположим, что первые i цифр числовой строки S расшифрованы в буквенную строку, существует f [i] способов

Уравнение переноса
Вставьте описание изображения сюда
Вставьте описание изображения сюда
Вставьте описание изображения сюда

class Solution:
    def calculate(self, str):
        n = len(str)
        f = [0] * (n+1)

        f[0] = 1
        if n == 0:
            return 0
        for i in range(1, n+1):
            #判断最后一位
            t = ord(str[i-1]) - ord('0')
            if t >= 1 and t <= 9:
                f[i] += f[i-1]

            #判断最后两个地址
            if i >= 2:
                t = (ord(str[i-2]) - ord('0')) * 10 + (ord(str[i-1]) - ord('0'))
                if t >= 10 and t <= 26:
                    f[i] += f[i-2]
        return f[n]

рекомендация

отblog.csdn.net/Sgmple/article/details/113103552
рекомендация