/*
translation:
有n个连续摆放的盒子,分别标记U,L。现在要求至少要有三个U摆在一起,有多少种摆法?
solution:
设最左边开始的连续3个U盒子位置为i,i+1,i+2(3个连续后可能还有接着相邻的U盒子)。则左边肯定没有连续3个
的盒子的情况,为了防止前面盒子与i,i+1形成连续的3个盒子,强制让i-1为L。设f[i]为最终的答案,g[i]为i个盒子摆在一起没有
连续3个U的情况数目。则g[i] = 2^i-f[i].。f[n] = 2^(n-3) + sum(g[i-2]*2^(n-i-2))(其中i:2->n-2)
2^(n-3)是i为1的情况。
note:
1:注意分类方法,考虑的是"根据最左边的3个U"来分类。
date: 2016.10.6
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 35;
typedef long long ll;
ll f[maxn], g[maxn];
int n;
ll pow(int a, int n) {
if(n == 0) return 1;
ll x = pow(a, n/2);
ll ans = x * x;
if(n % 2 == 1) ans *= a;
return ans;
}
void init() {
f[0] = 0; f[1] = 0; f[2] = 0;
g[0] = 1; g[1] = 2; g[2] = 4;
for(int i = 3; i <= 30; i++) {
ll res = 0;
for(int j = 2; j <= i-2; j++)
res += (g[j-2] * pow(2, i-j-2));
f[i] = pow(2, i-3) + res;
g[i] = pow(2, i) - f[i];
}
}
int main() {
init();
while(cin >> n && n) {
cout << f[n] << endl;
}
}
uva580(递推关系)
最新推荐文章于 2021-08-15 10:52:00 发布