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)

相关推荐
RTC老炮17 小时前
音视频FEC前向纠错算法Reed-Solomon原理分析
网络·算法·架构·音视频·webrtc
噜噜噜噜鲁先森17 小时前
STL——String类
开发语言·c++·算法
Severus_black17 小时前
算法题C——用队列实现栈/用栈实现队列
c语言·数据结构·算法·链表
谭欣辰17 小时前
详细讲解 C++ 有向无环图(DAG)及拓扑排序
c++·算法·图论
承渊政道17 小时前
【递归、搜索与回溯算法】(掌握记忆化搜索的核心套路)
数据结构·c++·算法·leetcode·macos·动态规划·宽度优先
闻缺陷则喜何志丹17 小时前
【 线性筛 调和级数】P7281 [COCI 2020/2021 #4] Vepar|普及+
c++·算法·洛谷·线性筛·调和级数
zzzsde17 小时前
【Linux】线程概念与控制(1)线程基础与分页式存储管理
linux·运维·服务器·开发语言·算法
穿条秋裤到处跑17 小时前
每日一道leetcode(2026.04.23):等值距离和
算法·leetcode·职场和发展
少许极端18 小时前
算法奇妙屋(四十九)-贡献法
java·算法·leetcode·贡献法
武帝为此18 小时前
【特征选择方法】
算法·数学建模