uva580(递推关系)

/*
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;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值