题目:完全平方数
定义了一个数组,用来存储n之前每一个元素的完全平方数的最少数量,这样就得到了状态转移方程:
$ dp[i] = 1 + \min_{1 \le j^2 \le i} \{ dp[i - j^2] \} $
其中,i 是从1到 n 的所有数字,j^2是小于等于 i 的所有完全平方数
每次当 n 减去 i 之后,都会以 i 为右边界进行一次遍历,此时就是对每一个 i 进行”局部穷举“,看看此时有哪些组成 j^2 的最少数字数量,我们会选取最小的作为当前的结果
1int numSquares(int n)
2{
3 std::vector<int> f(n + 1);
4 for(int i = 1; i <= n; i++)
5 {
6 int minn = INT_MAX;
7 for(int j = 1; j * j <= i; j++)
8 minn = std::min(minn, f[i - j * j]);
9
10 f[i] = minn + 1;
11 }
12 return f[n];
13}