题目要求
分析
我们可以用递归做,但可能会超时或者超内存。最起码不算好的算法。
那么我们就可以考虑找到递推规律,利用简单的DP处理。
在迭代的时候发现:(i >= 2)
i为偶数的时候,存在:f(i) = f(i-1) + f(i/2)
i为奇数的时候,存在:f(i) = f(i-1)
做一下简单模拟:
n = 0, result = 1;
n = 1, result = 1;
n = 2, result = 2;
n = 3, result = 2;
n = 4, result = 4;
n = 5, result = 4
n = 6, result = 6;
n = 7, result = 6;
符合我们所写的方程。
AC代码(Java语言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] f = new int[1001];
f[0] = f[1] = 1;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.close();
for(int i = 2; i <= n; i++){
if(i % 2 == 0){
f[i] = f[i-1] + f[i/2];
} else {
f[i] = f[i-1];
}
}
System.out.println(f[n]);
}
}