*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 */
原文地址:https://www.cnblogs.com/--ZHIYUAN/p/6048198.html