回溯算法符号三角形java_算法设计与分析——符号三角形问题(回溯法)
一、问题描述
下图所示的三角形中,有14个“+“和14个“-”。2个同号下面是+,两个异号下面是-。
在一般情况下,符号三角形的第一行有n个符号。符号三角形问题,要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”相同。
二、算法分析
用n元组x[1:n]表示符号三角形的第一行的n个符号,当x[i]等于1时,表示符号三角形的第一行的第i个符号为“+”;当x[i]等于0时,表示符号三角形的第一行的第i个符号为“-”;1<=i<=n。由于x[i]是2值的。所以在用回溯法解符号三角形问题时,可以用一棵完全二叉树来表示其解空间。在符号三角形的第一行的前i个符号x[1:i]确定后,就确定了一个有i*(i+1)/2个符号组成的符号三角形。
(i*(i+1)/2来自首项为1、公差为1的等差数列的求和公式)
下一步确定x[i+1]的值后,只要在前面已确定的符号三角形的右边加一条边,就可以拓展为x[1:i+1]所对应的符号三角形。最终由x[1:n]所确定的符号三角形包含的“+”个数与“-”同为n(n+1)/4(n(n+1)/2的一半,也就是一半的符号)。因此,在回溯可将“+”、“-”个数均 不超过n(n+1)/4为约束条件。同时,对于给定的n当n(n+1)/2为奇数时,显然不存在“+”和“-”个数相同的符号三角形。
这里举一个第1行是4个字符的符号三角形的子集树
对于这道题只要确定第1行的n个符号其实最后画出的符号三角形一定是唯一的,在求第1行n个符号的时,每次确定一个符号时,由该字符与之前已有的字符能组合出一个符号三角形,该符号三角形为最终要求的符号三角形的子集,新确定的符号可以作为右边如图红色箭头那样,将路径上的符号得到。
import java.io.*;import java.util.*;public classTriangles {public static int n, half, count;//第一行的符号个数n,当前“+”个数count,
public static int[][] p;//符号三角形矩阵
public static long sum;//符合条件的符号三角形个数
public static long computs(intnn) {
n=nn;
count= 0;
sum= 0;
half= n * (n + 1) / 2;if (half % 2 == 1)//无解的判断:n*(n+1)/2为奇数
{return 0;
}
half= half / 2;
p= new int[n + 1][n + 1];for (int i = 0; i < n; i++)//数组初值
{for (int j = 0; j < n; j++) {
p[i][j]= 0;
}
}
backtrack(1);returnsum;
}public static void backtrack(intt) {if ((count > half) || (t * (t - 1) / 2 - count >half))return;//若符号统计未超过半数,并且另一种符号也未超过半数
if (t >n) {
sum++;
}//当i>n时,算法搜索至叶节点,得到一个新的“+”个数与“—”个数相同的符号三角形,当前已找到的符号三角形数sum增1.
else{for (int i = 0; i < 2; i++) {
p[1][t] =i;
count+=i;for (int j = 2; j <= t; j++) {if (p[j - 1][t - j + 1] == p[j - 1][t - j + 2]) {
p[j][t- j + 1] = 1;//2个同号下面都是“+”
}else{
p[j][t- j + 1] = 0;//2个异号下面都是“-”
}
count+= p[j][t - j + 1];
}
backtrack(t+ 1);for (int j = 2; j <= t; j++) {//回溯时取消上一次的赋值
count -= p[j][t - j + 1];
}
count-=i;
}
}
}public static voidmain(String[] args) {
System.out.println("请输入第一行符号值:");
Scanner read= newScanner(System.in);int n =read.nextInt();
System.out.println("个数:" +computs(n));
}
}
三、算法效率
回溯算法符号三角形java_算法设计与分析——符号三角形问题(回溯法)相关推荐
- 算法设计与分析第5章 回溯法(二)【回溯法应用】
第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...
- [XJTUSE 算法设计与分析] 第五章 回溯法
第五章 回溯法 填空题会有代码填空,大题会手动回溯 学习要点 理解回溯法的深度优先搜索策略. 掌握用回溯法解题的算法框架 (1)递归回溯 (2)迭代回溯 (3)子集树算法框架 (4)排列树算法框架 5 ...
- 计算机算法设计与分析——数字三角形问题
计算机算法设计与分析(算法实现题3) 3-4 数字三角形问题 问题描述: 给定一个由n行数字组成的数字三角形.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计: ...
- 计算机算法设计与分析 数字三角形
3数字三角形问题:: 给定一个有n行数字组成的数字三角形,如下图所示: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 设计算法,计算从三角形的顶端至底的一条路径,使该路径经过的数字总和最 ...
- 算法设计与分析第5章 回溯法(一)【回溯法】
第5章 回溯法 5.1 回溯法 1.回溯法的提出 有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法. 2. 问题的解空间 (1)问题的解向量:回溯法希望 ...
- 算法设计与分析——第五章回溯法 批处理作业调度 + 最大团问题+图的m着色问题
文章目录 6.批处理作业调度(排列树) 7.最大团问题 8.图的m着色问题 6.批处理作业调度(排列树) 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理 ...
- 符号三角形-计算机算法设计与分析【1600+字解析 dfs全排列 列举情况】【题意分析】【算法分析】【思路是怎么来的】【过程是什么】
符号三角形 题意分析 思路过程分析 算法分析 下图是由14个"+"和14个"-"组成的符号三角形.2个同号下面都是"+",2个异号下面都是& ...
- 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt
<王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...
- 0x08算法设计与分析复习(二):算法设计策略-回溯法2
参考书籍:算法设计与分析--C++语言描述(第二版) 算法设计策略-回溯法 子集和数 问题描述 已知n个不同的正数wi(0≤i≤n−1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等 ...
- 算法设计与分析之数字三角形问题(C++解法)
算法设计与分析之数字三角形问题 前言 问题描述 确定数据存储方式 确定分析方法 编码 顺推法 逆推法 前言 此文章完成数字三角形问题的简便算法,如果文中有错请给予反馈,刘某不胜感激 问题描述 确定数据 ...
最新文章
- 微软分享史上最大基于Transformer架构的语言生成模型
- 解决maven3.6版本不兼容idea2017问题
- C语言学习笔记(五) 数组
- 有时候,爱就是那么简单
- python 生成pdf收据_python如何与以太坊交互并将区块链信息写入SQLite
- 如何用python进行相关性分析_如何在python中检查连续变量和分类变量之间的相关性?...
- 服务器不安装Excel,实现导出Excel功能
- 菜鸟之路-浅谈设计模式之单例设计模式
- python json序列化对象_Python学习之json序列化
- OUTLOOK新邮件到达提醒设置以及outlook最小化到托盘设置
- java panel paint_java – 如何使用jpanel与paint(或重绘)
- 五个维度打造研发管理体系
- SpringMVC+LayUI 交通事故管理系统
- gz是什么意思饭圈_网上看不懂的字母缩写!知道Xs是什么意思吗?不是尺寸!...
- php将ppt转jpg图片的具体步骤代码
- 冷色调也能表现画面炽热感?原来还有这么多种方法~
- windows编程学习感悟
- 共轭相似以及共轭对角化
- 【C++】关键字restrict的作用
- win10更新后office2016图标显示空白