algorithm - 使用动态规划将自然数表示为平方和

标签 algorithm

问题是找到求和为数字 n 所需的最小平方数。

一些例子:

min[ 1] = 1 (1²)
min[ 2] = 2 (1² + 1²)
min[ 4] = 1 (2²)
min[13] = 2 (3² + 2²)

我知道 Lagrange's four-square theorem它指出任何自然数都可以表示为四个平方和。

我正在尝试使用 DP 解决这个问题。

这是我想出来的(不正确)

min[i] = 1 where i is a square number
min[i] = min(min[i - 1] + 1, 1 + min[i - prev]) where prev is a square number < i

解决这个问题的正确 DP 方法是什么?

最佳答案

我不确定 DP 是否是解决此问题的最有效方法,但您要求使用 DP。

min[i] = min(min[i - 1] + 1, 1 + min[i - prev]) 其中 prev 是平方数 < i
这很接近,我会把条件写成

min[i] = min(1 + min[i - prev]) for each square number 'prev <= i'

请注意,对于每个 i,您需要检查 prev 的不同可能值。

这是 Java 中的简单实现。

Arrays.fill(min, Integer.MAX_VALUE);
min[0] = 0;
for (int i = 1; i <= n; ++i) {
    for (int j = 1; j*j <= i; ++j) {
        min[i] = Math.min(min[i], min[i - j*j] + 1);
    }
}

关于algorithm - 使用动态规划将自然数表示为平方和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3967769/

相关文章:

java - 为什么 "while"在普林斯顿的加权快速联合实现中使用

java - 在不使用正则表达式的情况下在java中进行正则表达式匹配

algorithm - 完全图中两个顶点之间的最短路径

algorithm - 这个函数返回的值是多少?

algorithm - 与 DFA 相比,NFA 的优缺点?

algorithm - 有约束的数字序列

r - 为什么 r 中关于生成 Gamma 随机变量的代码没有返回预期的输出?

algorithm - 计算体射线转换中的梯度

algorithm - 国际象棋任务 - King,Rook Vs King

Java D 堆实现 - deleteMin() 中的无限循环