http://oj.ecustacm.cn/problem.php?id=1392
找规律: 发现就是一个斐波那契。跟兔子繁殖,简单的跳楼梯是一个类型的。
#include<cstdio>
#include<iostream>
using namespace std;
int main(void)
{
int a[31]={0,2,3};
for(int i=3;i<=30;i++)
{
a[i]=a[i-1]+a[i-2];
}
printf("%d\n",a[30]);
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int get(int x,int k)// 当前第k位是不是1
{
return x>>k&1;
}
int main(void)
{
int cnt=0;
for(int i=0;i<(1<<30);i++)//二进制枚举所有的情况
{
bool flag=true;
for(int j=1;j<30;j++)
{
if(get(i,j)&&get(i,j-1))//看有没有相邻的1
{
flag=false;
break;
}
}
if(flag)
{
cnt+=1;
}
}
cout<<cnt<<endl;
return 0;
}
递推:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(void)
{
int f[32][2]={0};
f[0][0]=1;
//f[i][0] 所有长度为 i 最后一位是0 且没有连续的1 的方案数
for(int i=1;i<=30;i++)
{
f[i][0]=f[i-1][0]+f[i-1][1];
f[i][1]=f[i-1][0];
}
cout<<f[30][0]+f[30][1]<<endl;
return 0;
}