zjut 1337 1/2 Sequence 递归+数组优化

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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值