Виклик, прийнятий з дозволу мого університетського конкурсу викликів
Залежність, яку ми маємо від мобільних телефонів, змушує заряджати їх щовечора до максимального рівня акумулятора, тому ми не ризикуємо вичерпати живлення до середини наступного дня. Навіть є люди, які, побачивши безкоштовну розетку протягом дня, ставлять її зарядку за те, що може статися.
Я одна з них.
Протягом багатьох років я вдосконалював свою техніку, щоб не заряджати батарею до максимуму щовечора. Зі своїми ідеально відомими процедурами, що повторюються, я зрозумів, в який час доби я зможу робити ті часткові заряди (і на скільки одиниць рівень збільшиться) та що знизить рівень заряду акумулятора між кожним зарядом. За допомогою цих даних щовечора я підраховую мінімальний рівень заряду акумулятора, який я маю вийти з дому наступного дня, щоб він ніколи не опускався нижче мого самонав’язаного порогу в два одиниці.
Те, що я ще не встиг освоїти, - це той самий розрахунок, коли я покидаю встановлену процедуру і у мене є кілька альтернатив, щоб робити речі. Це трапляється, наприклад, у дні, коли я рухаюся в інше місто, до якого я можу приїхати різними шляхами.
У своєму першому підході до проблеми я припускаю, що хочу рухатися навколо «шахової дошки», починаючи з лівого верхнього кута до правого нижнього кута. У кожній "комірці" я можу або зарядити мобільний телефон певною сумою, або не можу, і рівень його навантаження знизиться.
Виклик
Враховуючи матрицю цілих чисел FxC, виведіть мінімальний об'єм акумулятора, який мені потрібно перейти з лівого верхнього кута в правий нижній кут, без того, щоб рівень навантаження ніколи не опускався нижче 2 одиниць.
У матриці позитивне число вказує, скільки я можу зарядити свій мобільний телефон, перш ніж мені доведеться відновити свій шлях, тоді як негативне число вказує на відсутність розетки і що на цю суму акумулятор мобільного телефону знижує рівень заряду. Гарантується, що величини у вихідній та кінцевій клітинках (у верхньому лівому та нижньому правому куті) завжди дорівнюють 0, а решта значень (абсолютна величина) не перевищує 100.
Приклад наведено
:
Шлях, який мені потрібно менше акумулятора:
А мінімальний мій рівень акумулятора, який мені потрібен, - 4
Примітки
- "Старт" завжди буде у верхньому лівому куті
- Кінець завжди буде в нижньому правому куті
- Ви не можете перейти до осередку, який ви вже пройшли. Приклад: Отримавши позицію (0,1), ви не можете перейти до початкової точки (0,0)
- Рівень акумулятора не може (з будь-якої причини) не перевищувати 2
- Можна припустити, що завжди буде початок і кінець
- Ви можете прийняти одновимірні масиви як багатовимірні, якщо вам потрібно
[1,2,3] == [[1,2,3]]
- Існує кілька правильних (мінімально необхідних зарядів) шляхів
- Ваша мета - вивести лише найнижчий необхідний початковий рівень акумулятора, а не маршрут
- Можна йти лише вертикально і горизонтально (не по діагоналі)
Випробування
[0, 0] => 2
[0, 1, 0] => 2
[0, -1, 0] => 3
[0, 15, -20, 5, 0] => 7
[[0, -3],[-5, 0]] => 5
[[0, -5, -9, 5], [-3, 5, 2, -2], [2, -4, -4, 0]] => 5
[[0, -1, 1, -1], [-1, -1, -1, -1], [-1, 1, -1, -1], [1, 1, -1, 0]] => 4
[[0,1,-1],[-9,-9,1],[-9,1,-1],[-9,-1,-9],[-9,1,0]]
0s
розміщених у верхньому лівому куті, а другий у нижньому правому куті