符号三角形问题;回溯算法;子集树问题;时间复杂度O(2的n次方);
2010-04-02 16:12
393 查看
#include <iostream> using namespace std; class Triangle { private: int num;//第一行的符号数量 int **p;//存储+ -号,0表示-,1表示+ int count;//记录+号数量,根据+号数量,可以用i*(i+1)/2-count求出减号数量 int sum;//记录+与-数量相等且等于num*(num+1)/4的情况 const int half;//加号=等号=总符号数/2 public: //构造函数 Triangle(int num):half(num*(num+1)/4) { this->num=num; count=0; sum=0; p=new int* [num+1]; for(int i=0;i<=num;i++) { p[i]=new int[num+1];//开辟一个num*num的矩阵,用于在回溯过程中记录三角形符号分布 } } //调用回溯算法,并且先判断num*(num+1)/2是否为奇数 void triangleSolve() { if(num*(num+1)/2%2==0) { triangle(1); display(); } else { cout<<"不存在可能性"<<endl; return; } } //回溯核心算法 void triangle(int i) { if(i>num) { ++sum; return; } for(int j=0;j<=1;j++) { p[1][i]=j; count+=j; for(int k=2;k<=i;k++) { p[k][i-k+1]=p[k-1][i-k+1]^p[k-1][i-k+2];//相同则为1,不同则为0,代表题目的规则.1为+,0为- count+=p[k][i-k+1]; } if(count<=half&&i*(i+1)/2-count<=half)//剪枝函数,约束函数,如果当前的+,-都小于符号数一半,那么继续递归 { triangle(i+1); } //恢复现场 for(int k=2;k<=i;k++) { count-=p[k][i-k+1];//减去新加入右侧边的+符号数量 } count-=j;//减去i位置的+数量 } } void display() { cout<<"边长为"<<num<<"的情况下,一共有"<<sum<<"种符号三角形具有同等数量的+与-号"<<endl; } }; void main() { Triangle test(7);//设置第一行有7个符号 test.triangleSolve();//解决问题 }
求+,-数量相等的三角形数量,整个三角形只与第一行的符号有关。
所以可以逐次安排第一行的每一个符号,由于每次安排好一个符号,那么就会在原确定的三角形最右侧加一条三角形边。 所以,利用回溯法,逐次对第一行每一个位置的符号做出选择,并且扩充新的三角形边。 为了实现回溯算法的优化,必须有剪枝函数,所以这里用+,-都小于总符号数的一半作为约束,只要能够递归到第n+1个字符,说明1到n个字符的安排都满足+<=half,-<=half,所以就是+与-数量相等,sum++。 为了在回溯过程中能够及时的计算出三角形的最新状况,所以设置了二维数组用于存储三角形,根据图形的关系可以求出三角形的右侧边加入到二维数组中。
相关文章推荐
- 回溯算法;双船装载问题;限界+约束;子集树;时间复杂度:O(2的n次方);
- 小白笔记-----------------------符号三角形问题(回溯法---子集树)
- 〖編程·C++〗回溯算法:子集树 - 符号三角形问题
- 语句频度问题和算法得时间复杂度。
- 语句频度问题和算法得时间复杂度。
- 轮廓问题/Outline Problem-->改进的算法及时间复杂度分析
- 符号三角形问题
- 最大子序列和问题的求解(时间复杂度为O(N))
- 今天遇到一个问题:在程序中加入的定时触发器,当时出现这样一个问题,触发器定时2秒,程序从后台查询数据经过复杂处理后时间超过了2秒,我查阅好些网络上说有可能触发器等待程序执行完毕后,在触发下一次,也有说
- 符号三角形问题
- 动态规划;漂亮打印问题;时间复杂度O(n方); 思考方法记录在内;
- Python回溯法解符号三角形问题
- Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是
- 强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法
- 符号三角形问题
- 符号三角形问题
- 从一道求最大子列和问题分析时间复杂度
- 在线性时间复杂度内求解第k小元素问题
- 符号三角形问题
- CodeDom系列二---程序基本结构--符号三角形问题