一尘不染

使用动态编程将自然数表示为平方和

algorithm

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

一些例子:

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

我知道拉格朗日的四平方定理,该定理指出任何自然数都可以表示为四个平方的和。

我正在尝试使用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方法是什么?


阅读 249

收藏
2020-07-28

共1个答案

一尘不染

我不确定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);
    }
}
2020-07-28