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]);
	}
	
	
}

 

发布了57 篇原创文章 · 获赞 58 · 访问量 629

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103711798
今日推荐