P1433吃奶酪记忆化搜索

#include<iostream>
#include<iomanip>
#include<cmath> 
using namespace std;
const int N=20;
int n;
double spot[N][2],dis[N][N],state[1<<N][N],ans=1e9;
bool vis[N];
void dfs(int cur_p,int cur_s,double res){
    if(res>=ans)return;
    if(cur_s==(1<<n)-1){
        ans=res;return;
    }
    for(int i=1;i<=n;i++)
        if(!vis[i]){
            int try_s=cur_s+(1<<i-1);
            if(state[try_s][i]!=0&&state[try_s][i]<=res+dis[cur_p][i])continue;
            vis[i]=true;
            state[try_s][i]=res+dis[cur_p][i];
            dfs(i,try_s,state[try_s][i]);
            vis[i]=false;
            
        }
}
int main(){
    cin>>n;
    spot[0][0]=spot[0][1]=0;
    for(int i=1;i<=n;i++)cin>>spot[i][0]>>spot[i][1];
    for(int i=0;i<n;i++)
        for(int j=i+1;j<=n;j++){
            double t=(spot[i][0]-spot[j][0])*(spot[i][0]-spot[j][0])
                    +(spot[i][1]-spot[j][1])*(spot[i][1]-spot[j][1]);
            dis[i][j]=sqrt(t);
            dis[j][i]=dis[i][j];
        }
    dfs(0,0,0);
    cout<<fixed<<setprecision(2)<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lyt888/p/12684040.html