题目链接:HDU-2510
符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下: + + - + - + + + - - - - + - + + + - - + + - - + - - - + Input 每行1个正整数n <=24,n=0退出. Output n和符号三角形的个数. Sample Input 15 16 19 20 0 Sample Output 15 1896 16 5160 19 32757 20 59984
题意理解:题中给出相同出+不同出- 那么我们可以理解同或 将+理解为1 -理解为0
先通过dfs将每一个数字所代表的总数算出,再通过打表得出一个数组,最后通过数组来得到答案。
dfs代码(先将第一行求出,进而得出其他行)
void dfs(int x) { if(x>n) { for(int i=2;i<=n;i++) { for(int j=1;j<=n-i+1;j++) { a[i][j]=!(a[i-1][j]^a[i-1][j+1]); } } int sum=0,sum1=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==1) sum++; if(a[i][j]==0)sum1++; } } if(sum==sum1) ans++; return ; } for(int i=0;i<=1;i++) { a[1][x]=i; dfs(x+1); } }
得到数组AC代码
#include<map> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAX_N=100000+50; const int INF=0x3f3f3f3f; int a[26]={0,0,4,6,0,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229,0}; int main() { int n; while(cin>>n) { if(n==0) break; cout<<n<<" "<<a[n]<<endl; } return 0; }