@LIUHUAN
2020-06-28T09:44:51.000000Z
字数 1705
阅读 889
algorithm
int numSquares(int n) { return dfs(n); }
int dfs(int n) {
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
int x = sqrt(n);// 最大的枚举值,最小的从1开始
int c = INT_MAX;
for (int i = 1; i <= x; i++) {
auto y = dfs(n - i * i);
c = min(c, y + 1);
}
return c;
}
map
,也可以用数组,来缓存已经计算完的数据。对于已经获取的数据直接返回结果。map
来保存,例如map[3]=3
,下次计算的时候可以直接使用
int numSquares(int n) { return dfs(n); }
int dfs(int n) {
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (cache.find(n) != cache.end()) {// 已计算
return cache[n];
}
int x = sqrt(n);
int c = INT_MAX;
for (int i = 1; i <= x; i++) {
auto y = dfs(n - i * i);
c = min(c, y + 1);
}
cache[n] = c;//缓存结果
return c;
}
int numSquares(int n) { return dyp(n); }
int dyp(int n) {
if (n <= 0)
return 0;
if (n == 1) {
return 1;
}
vector<int> dp(n + 1, INT_MAX);
dp[1] = 1;
dp[0] = 0;
for (int i = 2; i <= n; i++) {
for (int j = sqrt(i); j >= 1; j--) {
dp[i] = min(dp[i], dp[i - j * j] + 1);
}
}
return dp[n];
}