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了

相关推荐
Ivanqhz7 分钟前
注意力机制
线性代数·算法·矩阵·哈希算法·dnn
z小猫不吃鱼10 分钟前
02 Optimal Brain Damage 详解:二阶信息剪枝的起点
算法·机器学习·剪枝
m0_6265352020 分钟前
近似attention
人工智能·算法·机器学习
atunet43 分钟前
关于算法优化的渐进式重构与代码级实践的技术7
算法
霖大侠1 小时前
Decoupled and Reusable Adaptation for Efficient Cross-Modal Transfer
人工智能·深度学习·算法·机器学习·transformer
a1117762 小时前
点云拼接 (RGB-D 点云建图)
算法·slam
Sam09272 小时前
【AI 算法精讲 16】BPE 分词:从字节对到子词
人工智能·python·算法·ai
LJHclasstore_luo2 小时前
【题解】WebGoC 102683.大雨过后
算法·goc编程
MrZhao4002 小时前
Agent 如何持续工作:任务持久化、后台执行与定时唤醒
算法