网站大量收购独家精品文档,联系QQ:2885784924

第5章+回溯法-2018年(学生).ppt

  1. 1、本文档共116页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
//若符号统计未超过半数,并且另一种符号也未超过半数? * * * * * 问题:对于第一行有n个符号的符号三角形,计算有多少个不同的符号三角形,其所含的“+”和“-”的个数相同。 解题思路:? 不断改变第一行每个符号,搜索符合条件的解,可以使用递归回溯?。 为了便于运算,设+?为0,-?为1,这样可以使用异或运算符表示符号三角形的关系?。++为+即0^0=0,?--为+即1^1=0,?+-为-即0^1=1,?-+为-即1^0=1;? 因为两种符号个数相同,可以对题解树剪枝,?当所有符号总数为奇数时无解,当某种符号超过总数一半时无解? * 2. 算法设计 解向量:用n元组x[1:n]表示符号三角形的第一行。 x[i]=1,表示第1行第i个符号为“+”; x[i]=0,表示第1行第i个符号为“-”。 可以用一棵完全二叉树表示其解空间。 在x[1:i]确定后,就确定了一个由i(i+1)/2个符号组成的符号三角形。 x[i+1]的值确定后,只要在已确定的三角形右边加一条边,即可得到x[1:i+1]所对应的符号三角形。 + + - + - + + + - - - - + - + + + - - + + - - + - - - + i i+1 * 对于给定的n,符号总个数为n(n+1)/2。 约束条件:当前三角形中“+”与“-”的个数均不超过n(n+1)/4。 当n(n+1)/2为奇数时,显然不是满足条件的符号三角形。 * class Triangle { friend int Compute(int); private: void Backtrack(int t); int n; //第一行的符号个数 int half; //n*(n+1)/4 int count; //当前“+”号个数 int **p; //符号三角形矩阵 long sum; //已找到的符号三角形数 }; * void Triangle::Backtrack(int t) //第1行有t个符号 { if((counthalf)||(t*(t-1)/2-count)half) //+或-的个数超过n(n+1)/4 return; if(tn) sum++; //符号填充完毕?? else for(int i=0;i2;i++) //每一位上取值只有两种情况-(0)或+(1) { p[1][t]=i; //第一行的第t位的符号为i count+=i; //累记+的个数 for(int j=2;j=t;j++) //计算新增边的其余各点; //当第一行符号=2时,可以运算出下面行的某些符号?? { p[j][t-j+1]=!(p[j-1][t-j+1]^p[j-1][t-j+2]); //通过异或运算下行符号?? count+=p[j][t-j+1]; } Backtrack(t+1); ?//在第一行增加下一个符号?? for(int j=2;j=t;j++) //恢复计数,为t位为下一种情况作准备回溯,判断另一种符号情况?? count-=p[j][t-j+1]; count-=i; } } 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 * int Compute(int n) { Triangle X; X.n=n; X.count=0; X.sum=0; X.half=n*(n+1)/2; if(X.half%2==1) //n(n+1)/2为奇数时,无解 return 0; X.half=X.half/2; * int **p=new int*[n+1]; for(int i=0;i=n;i++) p[i]=new int[n+1]; for(int i=0;i=n;i++) for(int j=0;j=n;j++) p[i][j]=0; X.p=p; X.Backtrack(1); return X.sum; }

您可能关注的文档

文档评论(0)

jyr0221 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档