菜鸡没学过状压,瞎写的
  • 板块P1433 吃奶酪
  • 楼主da_ke
  • 当前回复28
  • 已保存回复28
  • 发布时间2024/8/21 21:01
  • 上次更新2024/8/22 08:57:59
查看原帖
菜鸡没学过状压,瞎写的
766675
da_ke楼主2024/8/21 21:01
#include <bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)

using namespace std;
typedef long long ll;
typedef double db;

const int N=20;
const db INF=1e9+24;

int n;
db x[N],y[N],mem[N][1<<N];
bool vis[N][1<<N];

db edst(db x1,db y1,db x2,db y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

db dp(int i,int k)
{
    db& ans=mem[i][k];
    if(k==1<<(i-1)) return edst(0,0,x[i],y[i]);
    if(k==0) return INF;
    if(!vis[i][k]) return ans;
    vis[i][k]=1;
    rep(j,1,n)
    {
        if(i==j) continue;
        if(k&(1<<(j-1))==0) continue;
        ans=min(ans,edst(x[i],y[i],x[j],y[j])+dp(j,k-(1<<(i-1))));
    }
    return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin>>n;
    rep(i,1,n) cin>>x[i]>>y[i];
    db ans=INF;
    rep(i,1,n) ans=min(ans,dp(i,(1<<n)-1));
    cout<<ans;
}

不知道能不能记忆化,但是我是瞎写的,样例都没过。

2024/8/21 21:01
加载中...