*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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值