Існує лінійний алгоритм часу для рівномірного розбиття тексту на рядки максимальної ширини. Він використовує SMAWK (або Knuth & Plass) і "рівномірно" означає: http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness
Чи існує алгоритм чи увігнута вартість вартості для алгоритму, над якою буде враховано кількість рядків, на які я хотів би розбити текст замість максимальної ширини рядка? Також у лінійний час?
Іншими словами, я шукаю алгоритм розбиття рядків (або формування абзацу, або обгортання слів), де вхід - це бажана кількість рядків, а не потрібна ширина рядка.
Просто для опису практично непридатного підходу: Між кожною парою слів є N слів і проміжки N-1, M - бажана кількість рядків (M <= N). Після кожного пробілу може бути не більше одного (можливо, нульового) розриву рядків. Тепер алгоритм намагатиметься розміщувати перерви у кожній можливій комбінації, обчислюючи "нечіткість" і повертаючи найкращий. Як це зробити набагато швидше?
Також, чи має така проблема назва? До якої «родини» проблем вона належить? (Наприклад, "упаковка у смітник") Якщо мені не знадобиться ідеально оптимальне рішення, просто дуже гарне, чи можливо це вирішити набагато швидше? (якась форма евристики може бути корисною, якби для заданого входу завжди було одне і те ж, можливо, неоптимальне рішення).
Оновлення
Чандра Чекурі запропонував нижче "проблему в розділі Клейнберга і Тардоса про динамічне програмування". Це було добре прочитане, але він стосується розриву рядків на основі ширини, а не кількості рядків. Це може бути адаптоване до цієї проблеми, яку я зараз намагаюся з'ясувати. Ось хороше посилання на рішення, вони навіть стверджують, що вирішити його в лінійний час: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf
Крім того, в Посібнику з дизайну алгоритмів від Skiena є розділ "8.5 Проблеми з розділами", який, здається, є абсолютно тематичним, я все ще читаю його, важко. (На жаль, з того, що я зрозумів, це квадратична часова складність)