Description
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
Input
Output
Sample Input
6
Sample Output
6
(此部分不必输出)
6
16
26
126
36
136
解题思路:用记忆化搜索,实际上是对递推式:“f(x)=1+f(1)+f(2)+……+f(div/2);”的改进,设h[i]表示自然数i满足题意三个条件数的个数。
程序:
const
maxn=1000;
var
i,n:longint;
h:array[1..maxn]of longint;
procedure dfs(m:longint);
var
i:integer;
begin
if h[m]<>-1 then exit;
h[m]:=1;
for i:=1 to m div 2 do
begin
dfs(i);
inc(h[m],h[i]);
end;
end;
begin
readln(n);
for i:=1 to n do
h[i]:=-1;
dfs(n);
writeln(h[n]);
end.