динамічні вправи програмування на різанні струн


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})], ще

Зауважте, що застосування запам'ятовування до цієї рекурсії насправді економить роботу, оскільки перемикання порядку будь-якої послідовно застосованої пари розрізів призводить до вирішення тих же трьох підпрограм.


1

Завжди корисно спочатку знайти рекурсивний алгоритм, а потім перетворити його на таблицю.

  1. f(С,н)
  2.   якщо (C = ) повернути 0;
  3.   ще
  4.     opt = нескінченність;
  5.     для кожного зробітьcС
  6.       D={гС:г<c}
  7.       Е={е-c:еD,е>c}
  8.       оpт=мiн{оpт,f(D,c)+f(Е,н-c)}
  9.     повернення ;оpт+н

Тож ви можете запитати: чи не надто багато підмножин C можна помістити в таблицю? Зауважте, що потрібні лише "послідовні" підмножини. І є лише з них (чому) Ще одна проблема:.? Деякі записи зміниться значення вE. Ми можемо обійти це, вказавши початок і кінець у кожномуf,а не просто вказавши довжину.(н2)Еf


0

Це дуже схоже на Quicksort на мультисеті; оптимально, коли точка зрізу знаходиться найближче до середини, і тоді ми повторюємось.

ск

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.