Это задание для для тех, кто на работу в скором времени хочет устроиться, для начинающих в общем
|
Цитата:
Есть заказчики, которые знают, что "хотят", но не могут толком объяснить этого и приходится все из них вытягивать, либо решать что-то исходя из своих представлений. Одно дело не понимать какая взаимосвязь данных задачи, и как решить задачу, если знать в полном объеме о ней все. В первом случае это всецело на совести поставившего задачу, а во втором случае, это уже будет вашей профнепригодностью. |
Задача в том, что нужно найти максимальное сумму чисел из всех возможных комбинаций и при этом между числами, которые суммируются должен быть минимум один пустой индекс(уборка). Рони понял сразу, а я нет. Опыт не купишь)
|
По какому принципу этот алгоритм нужно написать, ведь есть же где два пропуска, а есть где один? Рони, можете дописать объяснение к вашему коду пожалуйста
|
Цитата:
если последний элемент не ноль добавляем ноль, строка 10 if (last) ar.push(0); если последние элементы ноль ноль добавляем элемент из первоначального массива, строка 14 else ar.push(arr[i]) если последние элементы не ноль и ноль создаём дубликат и добавляем ноль, к текущему массиву добавляем элемент из первоначального массива. строка 12 else if (prev) { up.push([...ar, 0]); ar.push(arr[i]) } весь алгоритм. |
Похоже, задача на динамическое программирование.
Алгоритм примерно такой: function maxSum(arr) { var memo = [0, 0]; function maxSumR(len) { if (len < 2) { return len ? arr[0] : 0; } else { if (memo[len]) { return memo[len]; } else { return memo[len] = Math.max(maxSumR(len - 1), arr[len - 1] + maxSumR(len - 2)); } } } return maxSumR(arr.length); } alert(maxSum([4, 10, 3, 1, 5])); Компа под рукой нет, не дебажил. Но в целом всё стандартно - сведение задачи n элементов к задаче для n-1 или n-2, плюс мемоизация, так что должно по идее за линейное время, если не ошибаюсь. Предполагается, что отрицательных чисел нет. Здесь вычисляется только сумма, а если надо индексы чисел, то придется допиливать. |
Пожалуй, тут без рекурсии можно, тогда не понадобится расходовать память на мемоизацию. Всё просто, в общем. Вот вариант, где по сути делается то же самое.
function maxSum(a) { if (!a || !a.length) { return 0; } var x = 0, y = a[0]; for (var i = 1; i < a.length; ++i) { var t = y; y = Math.max(x + a[i], y); x = t; } return y; } alert(maxSum([3, 20, 8])); alert(maxSum([4, 10, 3, 1, 5])); |
Часовой пояс GMT +3, время: 10:58. |