*HDU2510 DFS
符号三角形
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1785 Accepted Submission(s): 923
Problem Description
符号三角形的 第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
Source
代码:
1 // 打表;dfs出第一行后面的几行递推,就算打表别人家代码也打的那么漂亮。异或运算,1,0,分代表+,-; 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 int map[30][30]; 7 int ans[30]={0}; 8 int cnt=0; 9 void dfs(int x) 10 { 11 if(x>24) 12 return; 13 14 for(int i=0;i<2;i++) 15 { 16 map[1][x]=i; 17 cnt+=i; 18 for(int j=2;j<=x;j++) //这里很巧妙,第一行大于等于2个时下面的就推出来了。 19 { 20 map[j][x-j+1]=map[j-1][x-j+1]^map[j-1][x-j+2]; 21 cnt+=map[j][x-j+1]; 22 } 23 if(x*(x+1)/2==2*cnt) 24 ans[x]++; 25 dfs(x+1); 26 for(int j=2;j<=x;j++) 27 cnt-=map[j][x-j+1]; 28 cnt-=i; 29 } 30 } 31 int main() 32 { 33 dfs(1); 34 for(int i=1;i<=24;i++) 35 printf("%d,",ans[i]); 36 return 0; 37 } 38 /*结果: 39 0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229 ; 40 */