hdu2510

hdu2510 符号三角形
传送门

题意

符号三角形每一行的字符都是'+'或者'-' ,第一行长度为\(n(n\leq 24)\),之后每一行字符比上一行少\(1\),构成规则是上一行中,连续两个同号为'+',连续两个异号为'-'。给出\(n\),计算有多少个第一行有\(n\)个字符的符号三角形,满足'+'和'-'的数量相同。
例如\(n=7\)时的一种合法构造为:
++-+-++
+----+
-+++-
-++-
-+-
- -
+

题解

dfs打表
打表代码

#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;

const int maxn=30;
int n,a[maxn][maxn],ans,cnt0,cnt1;

void dfs(int id){
	if(id==n){
		if(cnt0==cnt1) ans++;
		return;
	}
	for(int i=0;i<n-id;i++){
		if(a[id-1][i]==a[id-1][i+1]){
			a[id][i]=1;
			cnt1++;
		}
		else{
			a[id][i]=0;
			cnt0++;
		}
	}
	dfs(id+1);
}

int main(){
	freopen("data.out","w",stdout);
	for(n=1;n<=24;n++){
		int m=1<<n;
		ans=0;
		for(int i=0;i<m;i++){
			cnt0=0;
			cnt1=0;
			for(int j=0;j<n;j++){
				if(i&(1<<j)){
					a[0][j]=1;
					cnt1++;
				}
				else{
					a[0][j]=0;
					cnt0++;
				}
			}
			dfs(1);
		}
		printf("%d,",ans);
	}
}

代码

#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;

int ans[25]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229};
int n;

int main(){
	while(scanf("%d",&n)!=EOF && n){
		printf("%d %d\n",n,ans[n]);
	}
}
posted @ 2021-03-12 23:47  fxq1304  阅读(32)  评论(0编辑  收藏  举报