PKU 2907-Collecting Beepers
問題概要
N(<=10)個の物体が格子上のマスの上に置かれている。全てを回収して元の位置に戻るのにかかる最小の時間を求めよ。
解法
BitDPする。(10!)なので全探索でも間に合うかも…?
実装(C++)
#include <iostream> #include <algorithm> using namespace std; #define chmin(a,b) a=min((a),(b)) int main(){ int T; cin>>T; while(T--){ int n,x[11],y[11],dp[11][1<<11]; cin>>x[0]>>y[0]; cin>>x[0]>>y[0]; cin>>n; for(int i=1;i<=n;i++)cin>>x[i]>>y[i];n++; for(int i=0;i<n;i++)fill(dp[i],dp[i]+(1<<n),9999999); dp[0][0]=0; for(int i=0;i<1<<n;i++){ for(int j=0;j<n;j++){ for(int k=0;k<n;k++){ if((i>>k)&1)continue; chmin(dp[k][i|(1<<k)],dp[j][i]+abs(x[k]-x[j])+abs(y[k]-y[j])); } } } cout<<"The shortest path has length "<<dp[0][(1<<n)-1]<<endl; } }