Problem D: 深入浅出学算法013-摆动数列
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 3535 Solved: 1424
Description
已知递推数列 a(1)=1,a(2i)=a(i)+1,a(2i+1)=a(i)+a(i+1),i为正整数,求该数列的第n项,前n项中的最大值
Input
多组测试数据,首先输入T表示组数,然后每行输入整数n(n<=3000)
Output
对于每个n输出一行,每行2个整数分别是第n项的值以及前n项的最大值
Sample Input
1
2011
Sample Output
225 321
HINT
其实这道题就是个递归。有些同学是用函数递归,这里我想说的是,函数递归在数字大的时候容易TLE,所以把函数递归改成数组,就可以节省很大的时间。
至于这题的递归,讲白了就是分奇偶的情况进行递归就行了。
上代码:
#include<stdio.h>
#include<string.h>
int a[10000];
int main(void)
{
int t,n,i,k,p;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
memset(a,0,sizeof(a));
scanf("%d",&t);
a[0]=0;a[1]=1;a[2]=2;a[3]=3;
if(t>=4)
{
for(k=4;k<=t;k++)
{
if(k%2==0)
a[k]=a[k/2]+1;
else if(k%2!=0)
a[k]=a[(k-1)/2]+a[(k-1)/2+1];
}
}
printf("%d ",a[t]);
int max=0;
for(p=0;p<=t;p++)
{
if(a[max]<a[p])
max=p;
}
printf("%d\n",a[max]);
}
}
return 0;
}