这是我的memory search方法
private int[] memo;
private int recursionNumSquares(int n){
if(memo[n] == 0){
memo[n] = Integer.MAX_VALUE;
for(int i = 1; i < n; i ++){
if(i * i == n){
memo[n] = 1;
break;
}
else{
memo[n] = Math.min(memo[n],recursionNumSquares(i)+recursionNumSquares(n-i));
}
}
}
return memo[n];
}
public int numSquares(int n) {
memo = new int[n + 1];
memo[1] = 1;
return recursionNumSquares(n);
}这是我的动态规划解法:
public int numSquares(int n) {
int[] memo = new int[n + 1];
Arrays.fill(memo, Integer.MAX_VALUE);
memo[1] = 1;
for(int i = 2; i <= n; i ++){
for(int j = 1; j < i; j ++){
if(j * j == i){
memo[i] = 1;
break;
}
else
memo[i] = Math.min(memo[i], memo[j]+memo[i-j]);
}
}
return memo[n];
}原因似乎是因为我使用了memo[i] = Math.min(memo[i], memo[j]+memo[i-j]), 而不是memo[i] = Math.min(memo[i], 1+memo[i-j * j])
我的问题是,我们似乎无法知道memo[i]一定就是1+memo[i - j*j],为什么不进行遍历,而是直接跳过很多值,选择了memo[i -j*j]?
我的解法结果是对的,只是超时了,这是截图:

谢谢老师!