这道题也是厉害,我是用的f[n]=2^(n-3)+f[n-2]这个公式,网上还有f[n]=f[n-1]+2*f[n-2]这个公式,都一样,递推关系不难找,00只可能有1和00经两次变换得到,但是n的范围是1<n<=1000所以得用大整数去做,不过还是超时了一次,优化了一晚上公式发现优化不了,上网搜了一下,原来把计算f[n]的程序放在输如之前,然后提取输出就可以了,代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int a[500]={1},f[1010][500]={0};
int main()
{
int n;
f[2][0]=1;
for(int i=3;i<=1001;i++){
int t=0;
for(int j=0;j<500;j++){
f[i][j]=(f[i-2][j]+a[j]+t);
t=f[i][j]/10;
f[i][j]%=10;
}
t=0;
for(int i=0;i<400;i++){
a[i]=a[i]*2+t;
t=a[i]/10;
a[i]%=10;
}
}
while(cin>>n){
if(n==1) cout<<0<<endl;
else if(n==2) cout<<1<<endl;
else{
int i=499;
while(f[n][i]==0) i--;
for(;i>=0;i--) cout<<f[n][i];
cout<<endl;
}
}
return 0;
}