发完发现没12点,后面等12点才把内容贴上的qaq
看到数据范围直接状压dp
状态表示
$f[st]$表示用的$num$状态为$st$下的最大$gcd*i$的和
状态转移
$count1$:计算状态为state下1的个数,那么偶数状态下,序列和转移的序号就是count1(state)/2
$$
f[cur] = max(f[cur],f[pre]+gcd(nums[i],nums[j])*(count1(cur)/2))
$$
class Solution:
def maxScore(self, nums: List[int]) -> int:
def gcd(a,b):
return gcd(b,a%b) if b else a
n = len(nums)
def count(st):
cnt1 = 0
for i in range(n):
if st & 1<<i:
cnt1+=1
return cnt1
f = [0]*(2**n)
for st in range(2**n):
cnt1=count(st)
if cnt1%2==1:continue
for i in range(n):
if st&1<<i:
for j in range(i+1,n):
if st&1<<j:
pre = st-2**i-2**j
f[st]=max(f[st],f[pre]+cnt1//2*gcd(nums[i],nums[j]))
return int(f[2**n-1])