Задачка о разложении числа в сумму квадратов
куда уж более вменяемо, чем заранее посчитать все 10000 ответов
В первую очередь на ум приходит динамическое программирование. По сложности N^(3/2). Ты это под "составлением полных таблиц" имел в виду?
Будем увеличивать кол-во слагаемых от 1 до N. Перебором значения первого слагаемого от 1 до N^(1/2) заполняем таблицу, используя предыдущие расчеты. (Если нет представления, то помечаем флагом или особым значением).
Поправка - немного другой алгоритм
Пусть C[i] — минимальное число слагаемых при разложении числа i. С[0] := 0. Тогда динамика такая:Сложность N^(3/2).
C[i] = 1 + min_{j \in [1, [sqrt(i)]]} (C[i - j^2])
Хочется как-то улучшить.
Хотя на счет минимального числа слагаемых может и не получиться.
Нет, это неправильный алгоритм. Пример: 41. По твоему выходит 41 = 36 + 4 + 1, хотя оптимальное разложение 41 = 25 + 16.
Да, я уже потом сообразил.
C[i] = 1 + min_{j \in [1, [sqrt(i)]]} (C[i - j^2])
Но хочется её как-то улучшить.зачем, если компьютер выдаст 10000 ответов всё равно быстрее, чем ты напишешь любую программу?
Оставить комментарий
Yulka-MOl
Столкнулся с задачкой.Пока кроме составления полных таблиц всех вариантов ничего на ум не пришло.
Теория чисел дает некоторые идеи по оптимизации этого процесса.
Может кто-то из форумчан предложит что-то более вменяемое? Можно ли Гауссовы целые числа как-то использовать?
Спасибо.