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

题目

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

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

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

输入格式

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

第二行包含 n n n 个整数 A i Ai Ai

输出格式

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

数据范围

1 ≤ n ≤ 12 1 \le n \le 12 1≤n≤12,
0 ≤ A i ≤ 1 0 9 0 \le Ai \le 10^9 0≤Ai≤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
但是没有通过

说明我们不能取完全部的排列,要剪枝

怎么减?

假如我们规定好在相同的数字中,索引小的一定排在前面,那么就不会有重复了。

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 i<x:return False
    #print(string,i)
    return True

cnt = 0

def DFS(string,n,last):
    global N,cnt
    if n == N+1:
        cnt+=1;return 
    
    for i in range(1,N+1):
        if (n==1) or (not state[i] and n>1 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了

相关推荐
-dzk-14 小时前
【回溯】LC 22.括号生成
算法·回溯
杜 硕15 小时前
顺序表算法
数据结构·算法
AgentMaster16 小时前
智能客服多渠道接入,5 款产品的全渠道整合能力对比与实战
大数据·人工智能·算法
sali-tec17 小时前
C# 基于OpenCv的视觉工作流-章108-区域筛选
图像处理·人工智能·opencv·算法·计算机视觉
Gigavision1 天前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp1 天前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz1 天前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外1 天前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
漂流瓶jz1 天前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
叠层归一研究院1 天前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi