Михаил, Можно что угодно разместить где угодно. Удобнее ли это будет - отдельный вопрос. И вообще, если у вас другая задачка, лучше задайте ее отдельным вопросом.
ffff567, двигаем вправо. Обрабатываем справа налево.
Смотрите код. Сдвиг происходит за счет прибавления a[current] к a[current+1] и зануления прошлой позиции. Это одновременно сдвигает элемент на место нуля вправо и объединяет пару одинаковых элементов.
Что значит, "двигать ноль"? Там же нет ничего. Но просто в этом алгоритме мы считаем, что можно значение сдвинуть, если дальше пустота (0) или такое же значение. Но для двух 0 подряд это условие выполняется. Однако двигать-то нечего, после выполнения сложения, у вас остается такой же массив в двумя нулями подряд.
Мы двигаем все числа по одному, справа-налево, пока можем. Если не можем текущее число двигать, переходим к более левому.
Ирина Грачева, Пополам делиться потому что в дп считаются оба варианта раскраски корня. Любая раскраска имеет двойника - можно все цвета инвертировать.
Но во время счета нам надо взять количество раскрасок поддерева со строго одним фиксированным цветом в корне. Например, когда мы считаем k, у нас есть k от отца. Теперь нам надо это домножить на варианты раскрасить поддерево в ребенке без изолированных вершин, но ребенок должен быть другого цвета! Поэтому берём n и делим на 2, чтобы выкинуть все варианты с совпадающим цветом.
Irina_Yurievna, Нам надо все эти диагональные пути целиком подсчитать. (кстати, не только диагональные, может быть из нижнего дерева в верхнее еще). Эти диагональные пути распадаются на 3 части: середина и 2 кусочка внутри копий дерева.
Середину мы дополнительно разбиваем на отдельные ребра и по каждому новому ребру считаем, сколько раз это ребро во всех путях встречается.
Оставшиеся концевые куски в деревьях мы в каждом дерове группируем вместе одинаковые и оказывается, что каждый кусок встречается ровно 3Y+2 раза в каждом дереве. Ну, потому что ровно столько есть вариантов выбрать второй конец пути. Вы зафиксировали кусок в дереве, выбрали любой второй конец - получили какой-то изначальный путь. От каждого этого изначального пути это кусок надо подсчитать. Дальше, эти 3Y+2 можно вынести за скобки и в каждом дереве остается сумма всех путей от угла - т.е. X.
Irina_Yurievna, X - это пути от угла дерева, а не все пути. Все пути мы считаем в answer. Но в процессе подсчета мы заметили, что куски новых путей можно сгруппировать и там вылезает как раз сумма путей из угла. Поэтому ввели X.
Irina_Yurievna, надо детали все прочитать. Y*Ai - этот множитель получается при счёте, сколько раз в ответе будут 4 ребра от новых вершин к копиям дерева. Множитель X получается при счете путей между деревьями, конкретно кусков этих путей между концом и углом дерева, в котором этот конец находится.
Irina_Yurievna,
Есть несколько книг, которые дадут вам почти всю базу для почти всех алгоритмических задач:
Кнут "Конкретная математика"
Кормен "Алгоритмы: построение и анализ"
Кнут "Искусство программирования"
SergeySerge11, Не надо считать отражение новым источником света, надо помнить пройденное до отражение расстояние и считать сумму до отражения и после.
Формула для яркости будет P/(l*l+0.001). 0.001 чтобы деления на 0 случайно не было. P - параметр источника света, l - длина пути луча. Можно не считать штраф на рассеивание, ибо он будет незаметен на фотне вот этого.
Это значит, что можно выбрать и два кубика и потом к максимальному еще и прибавить что-то?
Очевдино, но что лучше брать все возможные бонусы. И подбрасывание максимального количества кубиков и прибавление максимального числа.