Задача на динамическое программированиеDynamic programming problem
Difference between ru2 and en1, changed 2,041 character(s)
Не знаю, как правильно решить следующую задачу. Есть идеи, но они не проходят. Кто знает, направьте в верное русло, пожалуйста. Также, если знаете похожие задачи, то поделитесь ссылками на них. Оригинальная формулировка задачи с тестами доступна [здесьHello, codeforces! I do not know how to solve this DP problem, so I really want to know how. I will explain the condition of this problem briefly. [Link on original pdf](https://yadi.sk/i/Z8_wStsR3VTmJs).

Во входном файле до 50 тестов. Каждый тест — отдельная подзадача. Нужно вывести ответ для каждой подзадачи с новой строки. Подзадача состоит в следующем:↵

На нашем пути есть от 1 до 20 засад, в каждой засаде сидят $ k[i] $ разбойников (от 1 до 1000), чтобы они нас пропустили, нужно $ c[i] $ монет (от
On our way we will meet several groups of bandits (from 1 to 20). Each group has two parameters:↵

1. $ size[i] $ — number of bandits (from 1 to 1000)↵
2. $ cost[i] $ — cost we have to pay them if we do not want to have problems (from
 1 доto 1000). Изначально в нашем отряде 0 наемников.↵

Мы можем:↵

1. Нанять бандитов, сидящих в засаде, потратив $ 2*c[i] $ монет↵

2. Заплатить бандитам $ c[i] $ монет, чтобы они нас пропустили↵

3. Сразиться с ними. Погибает одинаковое количество с обеих сторон. Причем у нас те наемники, которые были наняты раньше, погибают первыми. Но наемники не выдерживают больше трех битв. После третьей битвы они уходят от нас, если выживают.↵

Необходимо проехать все засады, потратив наименьшую сумму денег. В ответ выдать эту сумму денег.↵

Ограничения: 3 секунды, 256 МБ на тест, таким образом, 0.06 секунд и 256 МБ на одну подзадачу.↵

Думал в сторону двумерного ДП. Параметры:↵

* количество пройденных засад↵

* набранная сумма↵

Для состояния $ dp[k][sum] $ хранить оптимальную тройку


We can:↵

1. Pay them $ cost[i] $ to pass them↵

2. Pay them $ 2 * cost[i] $ to hire them↵

3. Fight them. In this case we will lose $ size[i] $ hired soldiers. The first to die are those who had been hired earlier. The hired mercenaries leave our squad after participating in three battles.↵

You need to go all the way, having spent the least amount of money. Answer — this amount. At the initial time in our squad there are no soldiers.↵

The input file contains from 1 to 50 tests. On each input file, time limit — 3 sec, memory limit — 256 MB. Therefore, for one test — 0.06 sec. Tests can be different, numbers $ cost[i] $ and $ size[i] $ can be different.↵

I tried to apply two-dimensional dynamic programming:↵

1. $ k $ — Number of passed groups.↵

2. $ sum $ — The amount of money spent↵

The cell dp[k][sum] contains the best triple of the mercenaries
 $ (n1, n2, n3) $ — сколько наемников могут участвовать в одной битве, двух и трех соответственно. Для недостижимых позиций $ (-1, -1, -1) $. Но не ясно, как выбирать из двух возможных троек лучшую при одинаковых переходах. Если выбирать по сумме, то тройка $(1000, 0, 0)$ окажется лучше тройки $(0, 0, 999)$. но все наемники убегут после первой битвы. Если выбирать по компонентам, то$, who can fight in one battle, two and three battles. But I can not understand how to choose the best triple among all the transitions. ↵

If we use sum of components, triple $(1000, 0, 0)$ will be better, then $(0, 0, 999)$, but after battle with $size[i] = 1$ we get $(0, 0, 0)$ from first and $(0, 998, 0)$ from second triple and second will be better.↵

If we use lexicographic order, triple
 $(0, 0, 21)$, окажется лучше, чем $(999 will be better, then $(1000, 0, 10)$, но тогда не победить 1000 разбойников. Поэтому вариант с тройками не проходит, а больше адекватных идей нетbut first triple can not win in battle with $size[i] = 1000$ bandits.↵

I ask you to help finish this problem to the end and, if possible, provide links to similar problems
.

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en2 English dmkozyrev 2018-05-07 21:13:28 14 Tiny change: 'iginal pdf](https://' -> 'iginal pdf with examples](https://'
en1 English dmkozyrev 2018-05-07 21:01:20 2041 Initial revision for English translation
ru2 Russian dmkozyrev 2018-05-07 10:33:08 94
ru1 Russian dmkozyrev 2018-05-07 10:01:40 1888 Первая редакция (опубликовано)