回溯法--符号三角形(杂记)

文章介绍了如何使用回溯法解决符号三角形的问题,其中符号三角形的规则是同号下面为+,异号下面为-。通过异或运算简化问题,并利用DFS进行深度优先搜索,同时应用剪枝策略优化搜索过程。在回溯过程中,通过维护+和-的数量来确保约束条件得到满足。
摘要由CSDN通过智能技术生成

回溯法说来简单,写起来难,真的是要愁死。

回溯法有两种模板--子集树、排列树

5.4符号三角形--dfs

计算多少个满足条件的符号三角形,同号下面为“+”,异号下面为“-”。

根据异或的规则我们令“+”=0,“-”=1,(异或的运算规则:相同取0,相异取1)正好异或的规则满足题意,并且方便计数。

0^0=0

0^1=1

1^1=0

1^0=1

我们知道,第一行的符号确定了,后面的都确定了。所以需要遍历第一行的所有的“+”号和“-”号。

第一行一共有n和符号,变幻每个位置的符号,就是个叶子。

观察发现:满足条件的所有三角形中除了初始n=3个字符的三角形,其他所有满足结果要求的子三角形中,+和-的个数都是相同的。(但是最后输出的时候n=3有四种结果,也是对的,不知道为什么我第一次想的时候,这个n=3怎么不对了,可能是脑子有点小毛病)

下面列出n=3的四种情况

0 0 1

0 1

1

+ + -

+ -

-

0 1 0

1 1

0

+ - +

- -

+

1 0 0

1 0

1

- + +

- +

-

1 1 1

0 0

0

- - -

+ +

+

回溯的主要思想:

用n元组x[1:n]表示符号三角形的第一行的n个符号,当x[i]=1时,表示符号三角形的第一行的第i个符号为“+”;当x[i]=0时,表示符号三角形的第一行的第i个符号为“-”;1<=i<=n。

由于x[i]是二值的。所以在用回溯法解符号三角形问题时,可以用一棵完全二叉树来表示其解空间。

在符号三角形的第一行的前i个符号x[1:i]确定后,就确定了一个有i(i+1)/2个符号组成的符号三角形。

下一步确定x[i+1]的值后,只要在前面已确定的符号三角形的右边加一条边,就可以拓展为x[1:i+1]所对应的符号三角形。最终由x[1:n]所确定的符号三角形包含的“+”个数与“-”同为n(n+1)/4.

因此,在回溯可将“+”、“-”个数均不超过n(n+1)/4为约束条件。

同时,对于给定的n当n(n+1)/2为奇数时,显然不存在“+”和“-”个数相同的符号三角形。

剪枝:不等的直接return,如果cnt>half || (t*(t-1)/2-cnt)>half,当前的第一行第t个符号以前所对应的三角形,减号的个数大于一半了或者是加号的个数大于一半了都直接return。另外一个是要特判初始的总数,奇数肯定是不行的。

然后注意回溯的时候对sum值进行修改。剩下的就是dfs深度优先搜索的功底了。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值