状压dp求调!
查看原帖
状压dp求调!
519573
Daniel_yao楼主2023/7/19 11:14
#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007

using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 13, M = 6;

struct Node {
  double x, y;
  int f;
} a[N+M];

int n, m, k, w[N*M];

double dp[N+M][1<<N][1<<M], ans = 0x3f3f3f3f3f3f3f3f;

double dis(double x1, double y1, double x2, double y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int lb(int x) {
  return x & -x;
}

signed main() {
  n = read(), m = read();
  for (int i = 0; i < 64; i++) {
    int x = i;
    for (; x; x -= lb(x)) w[i]++;
  }
  For(i,0,n-1) a[k++] = (Node) {read(), read(), 0};
  For(i,0,m-1) a[k++] = (Node) {read(), read(), 1};
  memset(dp, 0x3f, sizeof dp);
  for (int S1 = 0; S1 < (1<<n); S1++) {
    for (int S2 = 0; S2 < (1<<m); S2++) {
      for (int i = 0; i < k; i++) {
        for (int j = 0; j < k; j++) {
          if(i == j) continue;
          if((a[j].f == 0) && S1 >> i & 1 == 1 && S1 >> j & 1 == 0)
            dp[i][S1|(1<<j)][S2] = min(dp[i][S1|(1<<j)][S2], dp[j][S1][S2] + dis(a[i].x, a[i].y, a[j].x, a[j].y) / w[S2]);
          if((a[j].f == 1) && S2 >> i & 1 == 1 && S2 >> j & 1 == 0) 
            dp[i][S1][S2|(1<<j)] = min(dp[i][S1][S2|(1<<j)], dp[j][S1][S2] + dis(a[i].x, a[i].y, a[j].x, a[j].y) / w[S2]);
        }
      }
    }
  }
  for (int S2 = 0; S2 < (1<<m); S2++) {
    for (int i = 0; i < k; i++) {
//      cout << dp[i][2^(n+1)-1][S2] << ' ';
      ans = min(ans, dp[i][(1<<n)-1][S2] + dis(0, 0, a[i].x, a[i].y) / w[S2]);
    }
  }
//  cout << ans << '\n';
  printf("%.10lf\n", ans);
	return 0;
} 
2023/7/19 11:14
加载中...