Блог пользователя NALP

Автор NALP, 14 лет назад, По-русски

Задача E. "Ну-ка, покатились!"

Рассмотрим решение с помощью метода динамического программирования.

Пусть Di - минимальный штраф, который мы заплатим, если будем решать задачу для шариков с номерами от i до n, причем шарик номер i будет обязательно приколот.

Тогда
Di = mini ≤ j  ≤ n(Dj + 1 + S(i, j) + ci)

где


Если числа S(i, j) не считать каждый раз, а пересчитывать, используя формулу S(i, j) = S(i, j - 1) + xj - xi, то решение требует всего O(n) памяти и  O(n2) времени на решение.

Важное замечание: в приведенных рассуждениях, шарики нужно рассматривать в порядке увеличения их координат.
  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да, с динамикой у меня плохо , я не дадумался до такого простого решения)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
можно узнать 8ой тест?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Большой случайный тест. бывают отрицательные числа. возможно, не отсортированные значения.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А можно поподробнее ? Я лично не очень шарю в этих формула( Откуда мы всё это узнали ? Из чего это всё  следует? какие слова в задачи наталкивают нас на идею такого решения?

Формулы это конечно хорошо,но по моему  нужно подумать и о начинающих ;)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Прочитайте некоторый материал по теории динамического программирования

    когда человек не знаком с ней, сложно объяснить, откуда что берется. Просто размышления по другому пути идут.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    рекомендую почитать книгу
    Алгоритмы и программы. Решение олимпиадных задач, автор Порублев Илья Николаевич и Ставровский Андрей Борисович
    для новичка - самое то!
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Спасибо :-) (давно собирался). А дальше после него что посоветуешь?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Лично я посоветовал бы прорешивать задачи на эту тему.

        Потому что ДП - это в некотором смысле даже стиль мышления, и научиться так мыслить по теории вообще не очень получится. Некоторые базовые знания получить необходимо, важно разобрать основные типичные задачи.

        Но дальше - только практика поможет.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А можно 6 тест узнать?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Это первый тест, где ответ - отрицательный. проверьте этот случай.
    Если не поможет - тогда дам тест
14 лет назад, # |
Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится
Извините что сделал такую "каку" :( то ли  сервер залагал то ли это я залагал (много раз на кнопочку "отправить" нажал )...
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
не подскажите 22 тест? задачу сдал, нашел что именно не работало, но так и не пойму почему. может быть тест поможет понять.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Большой случайный тест. Возможно, нужно использовать 64-битный тип.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Никак не пойму 8 тест. Скорее всего не понял условие. Расстояние между точками должно быть взято по модулю, а цена какая есть такую и считать? Можно привести альтеративный 8-му тест? 
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Прочитайте условие.
    Шарики катятся налево, и поэтому можно и без модуля. А цена булавки - это число ci.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У меня была немного другая динамика:
 вначале все шарики сортим
 f[1,1]=c[1];
 f[i,j], где i- это шарик который мы сейчас берем, а j- это последний шарик до i, который мы прикололи
 для j<i  f[i,j]=f[i-1,j]+x[i]-x[j]
 для j=i f[i,j]=минимум из всех f[i-1]+с[i];
Ответ: минимум из всех f[n];

P.S эта динамика требует больше памяти, чем та которая представлена в разборе, но на мой взгляд ее легче понять
»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Let $$$dp[i][0]$$$ be the minimum cost of reaching ith coordinate such that ith coordinate is pinned. and let $$$dp[i][1]$$$ be the minimum cost of reaching ith coordinate such that ith coordinate is not pinned. and let $$$dp[i][2]$$$ be the number of balls free for sliding at $$$i^{th}$$$ coordinate. Then suppose $$$dp[i][0] = min(dp[i - 1][0], dp[i - 1][1] + dp[i -1][2] * dist) + cost[i]$$$

and if $$$dp[i - 1][0] > dp[i - 1][1] + dist * dp[i - 1][2]$$$ then $$$dp[i - 1][1] = dp[i - 1][0]$$$ else $$$dp[i - 1][0] = dp[i - 1][1] + dp[i - 1][2] * dist$$$.

TLDR; I couldn't find bugs in my proof, any help highly appreciated! Also, can anyone prove the greedy algorithm? Thanks!