C. 積木
連結
題目描述
用積木塊來搭房子。
給出最長的積木塊的長度,該積木塊隻能當作地基。
如果目前搭建的房子的最頂端的積木塊的長度為k,可以選擇一個長度屬于[1,k/2]的積木放在房子的最頂端,或者選擇不再繼續放置積木。
求一共能搭建幾種房子。
題目分析
f(n)代表地基長度為n時的房子數量,先列舉前幾種情況看一看:
f(1)=1,f(2)=1+f(1)
f(3)=1+f(1),f(4)=1+f(2)+f(1)
f(5)=1+f(2)+f(1),f(6)=1+f(3)+f(2)+f(1)
… …
發現n為奇數時f(n)==f(n-1),n為偶數時f(n)==f(n-1)+f(n/2),經過思考發現十分合理。。。
代碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int f[1000001]={0,1};
int main(){
ll ans=1;
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(i&1){
f[i]=f[i-1];
}
else{
f[i]=(f[i-1]+f[i/2])%mod;
}
}
printf("%d\n",f[n]);
}