状态压缩dp一例

蓝桥杯国赛

from math import sqrt
inf = float('inf')
n, mx = map(int,input().split())

dot=[]
for i in range(n):
  x,y=map(int,input().split())
  dot.append((x,y))
e=[[inf for i in range(n+1)]for i in range(n+1)]

for i in range(n):
  for j in range(i,n):
    dis=sqrt((dot[i][0]-dot[j][0])**2+(dot[i][1]-dot[j][1])**2)
    if dis<=mx:
      e[i][j]=dis
      e[j][i]=dis
for i in range(n):
  for j in range(i,n):
    for k in range(n):
      if e[i][j]>e[i][k]+e[k][j]:
        e[i][j]=e[i][k]+e[k][j]

def get_s(state):
  res=[]
  for i in range(n):
    if (state&(1<<i)):
      res.append(i)
  return res

f=[[inf for i in range(n+1)]for j in range(1<<n+1)]  
f[0][0]=0

for i in range(1<<n):
  s=get_s(i)
  for j in s:
    pre_s=i^(1<<j)
    for k in s:
      if j!=k:
        f[i][j]=min(f[i][j],f[pre_s][k]+e[k][j])
print(f[(1<<n)-1][0])
posted @ 2025-05-25 15:45  邓佑孤  阅读(6)  评论(0)    收藏  举报