http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1337
1/2 Sequence
Time Limit:1000MS Memory Limit:32768K
Description:
Let's consider an infinite sequence A(i) defined as follows: (1) A(i) = 1, for all i<=1; (2) A(i) = A([(i+1)/2]) + A([(i-1)/2]), for all i > 1, where [x] denotes the floor function of x. floor(x) is the max integer that not bigger then x; You will be given n. Calculate A(n)(index is 0-based).Input:
Each line will contain one integers n (0<=n<=10^9). Process to end of file.Output:
For each n, output the n-th element in one line.Sample Input:
0 3 5
Sample Output:
1 3 5
Source:
laddiexu
刚开始的时候用递归,严重超时。
然后我就一直在想,要怎么样才能优化,或是还有什么更好的解决办法。
最后在DP的思想中得到启发,
DP 将局部最优解保存起来,到需要调用的时候直接用就行了,避免了重复计算。
于是我开始用了个100000的数组保存前100000的计算结果,递归的时候,也能避免大量重复的计算。
测试发现时间大大减少了,但是交的时候还是超时了。
果断吧数组改到1000000,AC了...爽!
下面贴代码:
#include <stdio.h>
int data[1000001]={1,1};
int f(int x)
{
if(x<=1000000)
return data[x];
else
return f((x+1)/2)+f((x-1)/2);
}
int main()
{
int n,i;
for(i=2;i<=1000000;i++)
data[i]=data[(i+1)/2]+data[(i-1)/2];
while(scanf("%d",&n)==1)
{
printf("%d\n",f(n));
}
return 0;
}