恢复做题第一道
开始对推导公式第二项迷糊了半天,看了几个解释貌似他们也不怎么真懂,想了半天才想明白,还是要用小的数先算算思路就有了。
看来这种题只能直接推公式,根本不能真算
1、奇数放不下,一定是0。 如何证明?
2、两列为一个单位,设现在求f[n] (n是偶数)
2.1 若前面一单位是单独的,则f[n]包含 f[n-2]*3
——
——
——...
2.2 反之,若前面一单元是和再前面一个单元结合的,从图中可以看出只有两种结合方法,则f[n]包含:
f[n-4]*2
————
| —— |
| —— |...
2.3 再向前仍然是连在一起的,则f[n]包含:
f[n-6]*2
——————
| —— —— |
| —— —— |...
2.4 以此类推
则 f[n] = 3*f[n-2] + 2*f[n-4] + 2*f[n-6] ......
-> f[n-2] = 3*f[n-4] + 2*f[n-6] + 2*f[n-8] ......
f[n] - f[n-2] = 3*f[n-2] - f[n-4]
f[n] = 4*f[n-2] - f[n-4]
#include <iostream>
#include <vector>
using namespace std;
int find(int n)
{
if(n % 2 == 1)
return 0;
else if(n == 0)
return 1;
else if(n == 2)
return 3;
else
return 4 * find(n - 2) - find(n - 4);
}
int main()
{
int a;
vector<int> arr;
while(cin >> a) {
if(a == -1)
break;
arr.push_back(a);
}
vector<int>::iterator it = arr.begin();
while(it != arr.end()) {
cout << find(*it) << endl;
it++;
}
}