DFS之剪枝(上交考研题目--正方形数组的数目)

题目

给定一个非负整数数组 A A A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。

返回 A A A 的正方形排列的数目。

两个排列 A 1 A1 A1 和 A 2 A2 A2 不同的充要条件是存在某个索引 i i i,使得 A 1 [ i ] ≠ A 2 [ i ] A1[i] \neq A2[i] A1[i]=A2[i]。

输入格式

第一行包含一个整数 n n n,表示数组 A A A 的长度。

第二行包含 n n n 个整数 A [ i ] A[i] A[i]。

输出格式

一个整数,表示 A A A 的正方形排列的数目。

数据范围

1 ≤ n ≤ 12 1 \le n \le 12 1≤n≤12,
0 ≤ A [ i ] ≤ 1 0 9 0 \le A[i] \le 10^9 0≤A[i]≤109。

输入样例:
复制代码
3
1 17 8
输出样例:
复制代码
2
样例解释

1 , 8 , 17 \] \[1,8,17\] \[1,8,17\] 和 \[ 17 , 8 , 1 \] \[17,8,1\] \[17,8,1\] 都是有效的排列。 思路:使用DFS() 注意使用全排列会有重复 solution1 : 使用set()进行去重,然后在进行判断 solution2 :直接进行得到最终的cnt,然后用 *假设原来有6个0,6个1,计算得到cnt=74,649,600* 那么直接用 74,649,600/6!/6! = 144 ,得到cnt=144 但是没有通过 ![在这里插入图片描述](https://file.jishuzhan.net/article/1781201165011128321/ddb48dcbf9bc2f2c8e8515835aee1eb5.webp) > 说明我们不能取完全部的排列,要剪枝 `怎么减?` 假如我们规定好在相同的数字中,索引小的一定排在前面,那么就不会有重复了。 ```python from itertools import permutations as per import math N = int(input()) s = [0] + list(map(int,input().split())) d = dict() for i in s: if i in d.keys(): d[i] += 1 else:d[i] = 1 state = [ False for i in range(N+1)] def judge(string,i,x): if (int(x) - int(math.sqrt(int(x)))*int(math.sqrt(int(x))))>1e-5 :return False else: for x in string: if s[i] == s[x] and i1 and judge(string,i,s[i] + last)): state[i] = True DFS(string+[i],n+1,s[i]) state[i] = False string = [] DFS(string,1,0) ''' fact = [ 1 for i in range(13)] for i in range(1,13): fact[i] = fact[i-1]*i for i in d.values(): cnt//=fact[i] ''' print(cnt) ``` 就可以AC了 ![在这里插入图片描述](https://file.jishuzhan.net/article/1781201165011128321/7894a87a3a42725bb810ca4ff272ecf3.webp)

相关推荐
B325帅猫-量子前沿技术研究所12 小时前
PSD和FFT的关系
人工智能·算法
闻缺陷则喜何志丹12 小时前
【排序】P6149 [USACO20FEB] Triangles S|普及+
c++·算法·排序·洛谷
avocado_green12 小时前
【LeetCode】90. 子集 II
算法·leetcode
tankeven12 小时前
HJ178 【模板】双指针
c++·算法
君义_noip12 小时前
信息学奥赛一本通 4131:【GESP2506六级】学习小组 | 洛谷 P13015 [GESP202506 六级] 学习小组
算法·动态规划·gesp·信息学奥赛
6Hzlia13 小时前
【Hot 100 刷题计划】 LeetCode 72. 编辑距离 | C++ 经典 DP 增删改状态转移
c++·算法·leetcode
穿条秋裤到处跑13 小时前
每日一道leetcode(2026.04.16):距离最小相等元素查询
算法·leetcode·职场和发展
XY_墨莲伊14 小时前
【实战项目】基于B/S结构Flask+Folium技术的出租车轨迹可视化分析系统(文末含完整源代码)
开发语言·后端·python·算法·机器学习·flask
小雅痞14 小时前
[Java][Leetcode simple] 1. 两数之和
java·算法·leetcode
somi714 小时前
ARM-驱动-09-LCD FrameBuffer
arm开发·驱动开发·算法·自用