Leetcode #279 | #Medium | [[1-D Динамика]] ## Идея Динамика... Заводим dp на i+1 элемент, сначала заполняем худшим случаем - `dp[i]=i` - для i-го числа сойдет сумма из i единиц. Дальше идем от 1 до конца. На каждом шаге начинаем перебирать от j=1 так что j\*j <= i. `dp[i] = min(dp[i], 1+dp[i-j*j]). В чем тут логика. Мы нашли новый квадрат, отнимаем его от числа и получили то, что уже посчитали ранее, прибавляем 1 так как использовали еще один, ну и делаем минимум с текущим результатом. ## [[Big-O]] - Время ```O(Nsqrt(N))``` - Память ```O(N)``` ## Код ```Java class Solution { public int numSquares(int n) { int[] dp = new int[n + 1]; for (int i = 1; i <= n; i++) { dp[i] = i; for (int j = 1; j * j <= i; j++) dp[i] = Math.min(dp[i], 1 + dp[i - j * j]); } return dp[n]; } } ```