динамическое программирование упражнений на струнах

16

Я работал над следующей проблемой из этой книги .

Определенный язык обработки строк предлагает примитивную операцию, которая разбивает строку на две части. Поскольку эта операция включает в себя копирование исходной строки, для строки длиной n требуется n единиц времени, независимо от местоположения среза. Предположим теперь, что вы хотите разбить строку на множество частей. Порядок, в котором делаются перерывы, может влиять на общее время работы. Например, если вы хотите вырезать строку из 20 символов в позициях 3 и 10 , то выполнение первого вырезания в позиции 3 влечет за собой общую стоимость 20+17=37 , в то время как выполнение позиции 10 вначале имеет лучшую стоимость 20+10=30,

Мне нужен алгоритм динамического программирования, который с учетом m сокращений находит минимальную стоимость разрезания строки на m+1 .

отметка
источник

Ответы:

10

Основная идея такова: опробуйте все позиции реза в качестве первого выбора, рекурсивно решите соответствующие детали, добавьте стоимость и выберите минимум.

В формуле:

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], else

Обратите внимание, что применение памятки к этой рекурсии фактически экономит работу, поскольку переключение порядка любой последовательно применяемой пары сокращений приводит к решению тех же трех подзадач.

Рафаэль
источник
1

Всегда полезно сначала найти рекурсивный алгоритм, а затем превратить его в таблицу.

  1. f(C,n)
  2.    if (C = ) return 0;
  3.    еще
  4.      opt = бесконечность;
  5.      для каждого docC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.      return ;opt+n

Поэтому вы можете спросить: не слишком ли много подмножеств С для таблицы? Заметьте, что нужны только «последовательные» подмножества. И есть только из них (почему?) Еще одна проблема:. Некоторые записи изменится значение в . Мы можем обойти это, указав начало и конец каждого а не просто указав длину. Ef(n2)Ef

Димитар Стратиев
источник
0

Это очень похоже на Quicksort на мультимножестве; Это оптимально, когда точка отсечения ближе всего к середине, а затем мы рекурсивно.

Если бы я дал вам перемешанную версию мультимножества M = {1,1,1..1,2,2 ... 2, ...., m, m..m}, где серии заканчиваются в каждой точке резки Вы бы оптимально быстро отсортировали его, выбрав отрезок ближайший к середине, в качестве оси. Операция разбиения элементов на левое и правое разбиение выполняет n операций так же, как и разбиение строки, поэтому вы можете использовать те же аргументы, что и для быстрой сортировки, чтобы показать, что медиана является оптимальной. sk

KWillets
источник