p1028:
题目提示使用递归做的,代码如下
void dfs(int num) {
if (num == 0) {
sum++;
return;
}
int temp = num / 2;
while (temp>-1) {
dfs(temp);
temp--;
}
}
但是,这段代码会导致超时,原因是其时间复杂度为0(N^2),而且并没有复用其中的数据,换成一个简单dp
void dp() {
ans[0] = ans[1] = 1;
for (int i = 2; i <=1000; i++) {
if (i % 2 == 0) {
ans[i] = ans[i / 2] + ans[i - 1];
}
else {
ans[i] = ans[i - 1];
}
}
}
时间复杂度为O(N),大大减少了运行时间,通过!