问题描述

题目分析

对于符号三角形问题,用n元组x[1:n]表示符号三角形第一行的n个符号,由于我们只有两种符号——"+“或”-",所以取值是一个二值问题,如果取"+“我们就假设x[i]=1,如果取”-“我们就设x[i]=0。所以这显然是一个解空间为子集树的问题。我们不需要每次都遍历到树的叶节点,可以通过剪枝来节约时间。
明确了解空间以后,我们要确定的就是约束函数。由于”+“和”-“数目相同,且我们的符号三角形有n行,所以总共有n(n+1) / 2个符号,因此每个符号只能有n(n +1) / 4。所以n(n+1)/2如果为奇数的话我们就要淘汰掉这种情况。
我们用sum表示合理的符号三角形的数目。count来统计其中的”+“和”-",如果是"+"我们将count+1,否则将count+0,最后用count与n(n+1)/4比较即可。
在这里我还是想要说明几个细节:
1.回溯问题我们应该回溯的是什么?
我们应该回溯的是状态,这个状态指的是我们在做了选择之后发生改变的变量,简而言之 就是约束函数约束的变量。这道题里,我们做出了选择,p[1][t]=i,于是我们就会马上让count+i,因为i如果等于0.则为负号,count自然不用加。当i=1时,符号为正号,count+1。所以我们改变的是count,而却count也是约束函数约束到的变量,所以我们在回溯过程中应该将其恢复原来的状态
2.回溯问题有没有更直接清晰的模板?
之前我们说过的子集树或排列树的解空间的模板都是分情况的更细致的模板,但其实回溯法也有一个更直接清晰的模板:

int Backtrack(i)
{for(穷举所有能做的选择){做选择回溯(Backtrack(i+1))撤销选择(约束函数约束的变量恢复原状态)}
}

还有一些实现上需要注意的地方,在代码里都有详细注释。

代码

#include <iostream>
using namespace std;
class Triangle
{friend int Compute(int);//计算符号三角形个数的函数private:void Backtrack(int i);int half,//符号三角形中符号数目的一半**p;//符号三角形矩阵n,//第一行符号个数count;//当前"+"的个数long sum;//符号三角形的符号个数(防止符号过多,声明为long类型)
};
void Triangle::Backtrack(int t)
{//可行性约束if(t > n){sum++;}//约束函数if(count > half || t*(t - 1) / 2 - count > half)//判断"+"和"-"是否都超过了一半{return;}for(int i = 0;i <= 1;i++){//从上往下,最上面是第一行//一定要给一个初始值p[1][t] = i;count += i;for(int j = 2;j <= t;j++){//这里可能有一些难推导,第t列的这个符号只能影响下面几行t列之前的符号//如果当前行为k,下面的行数为j,则t最多可以影响到的列数为t-(j-k)即为t-j+k//在一行中即为t-j+1p[j][t-j+1] = p[j-1][t-j+1] ^ p[j-1][t-j+2];count += p[i][t-j+1];//只能为0或者1}Backtrack(t + 1);//回溯//这里的回溯不需要将p[1][t]-=i,因为我们外层是有循环的,所以回到原地后下次循环会重新给p[1][t]一个数值的//在子集树中,我们只回溯最终的结果(如装载问题的最优容量和当前重量,这道题目的当前正号数目等),//并不会回溯选择的0或者1,因为在回溯回来的时候我们会改变它的//回溯的时候我们只找那些约束函数约束的变量来恢复到原状态,如本题的countfor(int j = 2;j < = t;j++){count -= p[j][t - j + 1];}count -= i;}
}
int Compute(int n)
{Triangle X;X.n = n;X.half = n(n+1) / 2;X.sum = 0;if(X.half % 2 == 1)return 0;X.half = X.half / 2;X.count = 0;//二维数组,记录符号三角形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;ij<=n;j++)p[i][j] = 0;}X.p = p;X.Backtrack(1);return X.sum;
}

总结

计算可行性约束需要O(n)的时间(因为1行有n个元素,我们需要对这个n个元素进行依次搜索并回溯,直到i > n才能sum++),而我们的解空间为子集树,结点个数为2^n
所以我们的时间复杂度为O(n2^n)

回溯法之符号三角形问题相关推荐

  1. Python回溯法解符号三角形问题

    以0表示加号,1表示减号 #! /usr/bin/env python #coding=utf-8 #! /usr/bin/env python #coding=utf-8 from __future ...

  2. 打印符号三角形问题java_回溯法之符号三角形问题

    问题描述: 由14个"+"号和14个"-"号组成的符号三角形. 2个同号下面是"+"号,2个异号下面是"-"号. 如图: ...

  3. 符号三角形问题(回溯)

    [cpp] view plaincopy /*回溯法解符号三角形问题 问题描述: 如下图是由14个"+"和14个"-"组成的符号三角形, 2个同号下面都是&qu ...

  4. 符号三角形问题(Java)

    符号三角形问题(Java) 文章目录 符号三角形问题(Java) 1. 前置介绍 2.算法设计 3.程序代码 4.算法效率 5.参考资料 1. 前置介绍 符号三角形定义 如下图所示,符号三角形是由14 ...

  5. java 符号三角形_算法java实现--回溯法--符号三角形问题

    符号三角形问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319 /* ...

  6. 算法设计与分析——回溯法——符号三角形问题

    #include<iostream> using namespace std;class Triangle{public:void Backtrack(int t);int n;//第一行 ...

  7. 回溯法-符号三角形问题

    问题: 分析: 约束函数:由于"+"和"-"数目相同,且我们的符号三角形有n行,所以总共有n(n+1) / 2个符号,因此每个符号只能有n(n +1) / 4. ...

  8. 符号三角形 回溯法 pta

    符号三角形的 第1行有n个由"+"和"-"组成的符号 ,以后每行符号比上行少1个,2个同号下面是"+",2个异 号下面是"-&qu ...

  9. 符号三角形问题—回溯算法—java实现

    问题描述: 下图是由14个"+"和14个"-"组成的符号三角形.2个同号下面都是"+",2个异号下面都是"-": 符号三 ...

  10. java符号三角形问题_实验四 回溯算法和分支限界法 符号三角形问题

    基本题一:符号三角形问题 一.实验目的与要求 1.掌握符号三角形问题的算法: 2.初步掌握回溯算法: 二.实验题图 下面都是"-".下图是由14个"+"和14个 ...

最新文章

  1. [mqtt]mqtt嵌入式移植
  2. linux 修改分辨率lcd_16.Linux-LCD驱动(详解)
  3. NC7-买卖股票的最好时机
  4. 遍历XML引擎版本以适应代码
  5. excel 下拉框选择月份显示不同的日历_秒杀Excel的数据分析工具,几分钟教你完成数据填报...
  6. 使用Vivado保存仿真波形数据并读取
  7. Upload LABS Pass-8
  8. 梯度提升树(GBDT)原理小结(转载)
  9. 惠普局域网共享打印机设置_网络共享惠普打印机的操作方法
  10. 离线地图瓦片下载工具
  11. html有多少种居中方式,html常用的几种居中方法
  12. Coloring Tree
  13. 服务器 备份 本地文件,云服务器备份本地文件
  14. DataSec数据防泄密系统
  15. 快速生成 Mac App icns图标
  16. 运行时错误91问题汇总
  17. Android 百度地图应用定位经纬度返回4.9E-324有关问题
  18. Android App 可以定时启动! 并且完成短信自动发送获取内容功能 (以获取闪讯密码为例 大学宿舍宽带)
  19. 1命名规则 sentinel_sentinel1 GRD数据和SLC数据预处理有什么区别吗?预处理流程是怎样的?...
  20. 基于spss的多元回归分析模型

热门文章

  1. MATLAB绘制二元函数图像
  2. 提升自己的认知-思维模型
  3. 萝卜章,电子封条……区块链风口将至?
  4. 【kali技巧】kali配置ssh服务
  5. STM32串口DMA方式发送数据
  6. R 回归 虚拟变量na_互助问答第30期:工具变量、GARCH模型操作和多项选择效信度...
  7. 【干货分享】 淘宝客发朋友圈的技巧
  8. 每一篇博文都是与自己的一次对话
  9. 数字游戏(number)
  10. 算法练习 - 五笔编码