洛谷P1433 吃乳酪---狀壓模板
阿新 • • 發佈:2018-12-22
這題相當於求最佳全排列,所以可以使用狀壓dp來做,其實遞迴加回溯也可以解決。
#include<bits/stdc++.h> using namespace std; inline float dis(float x1,float y1,float x2,float y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } float a[16][16],f[1<<16][16],d[16][16]; float ans=999999; int main() { int n; cin>>n; memset(f,0x7f7f,sizeof f); for(int i=1;i<=n;i++) { cin>>a[i][0]>>a[i][1]; } for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) { d[i][j]=dis(a[i][0],a[i][1],a[j][0],a[j][1]); } int s=(1<<n)-1; f[0][0]=0; for(int i=1;i<=n;i++) f[1<<i-1][i]=0; for(int i=1;i<=s;i++) for(int j=1;j<=n;j++) if((i>>j-1)&1) for(int k=1;k<=n;k++) if((i>>k-1)&1) f[i][j]=min(f[i][j],f[i^(1<<j-1)][k]+d[k][j]); for(int i=1;i<=n;i++) { ans=min(ans,f[s][i]+d[i][0]); } printf("%.2f",ans); return 0; }