UVA 580 危险的组合(数论—计数原理)

题目链接:https://vjudge.net/problem/UVA-580

设答案为f(n),以3个U为分类依据,让i,i+1,i+2成为3个U,这样i前面的可以不需要3个U,但是有一个问题,如果前i-1为U,那么i-1,i,i+1还是可以组成3个U,这样就不符合从第i个开始为至少3个U了,所以我们要剔除掉这种情况,可以强制让i-1为L,这样把i-1前面的可排列数量和i+2后面的可排列数量相乘就可以得到正确答案,接下来看边界,f[0],[1],[2]=0,因为不满足至少3个U的定义。

此外,n个盒子“没有3个U放在一起的”方案数为g(n)=2^n-f(n),可以写出关系式f(n)=2^(n-3)+   \small \sum_{i=2}^{n-2} * g(i-1)*2^(n-i-2).

f(n)里的2^(n-3)为当U在第一个位置时,不要遗漏这种情况,因为后面的表达式是从2开始的。

#include<bits/stdc++.h>

using namespace std;

int f[31];

int main(){
	int n;
	f[0]=f[1]=f[2]=0;
	
	for(int i=3;i<31;i++){
	f[i]=pow(2,i-3);
	for(int j=2;j<i-1;j++){
		f[i]+=pow(2,i-j-2)*(pow(2,j-2)-f[j-2]);
	}
}
	
	while(scanf("%d",&n) && n){
		printf("%d\n",f[n]);
	}
	
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值