POJ 2137
水,dp【i】【j】【k】,设为当前为i个牛,在它喜欢的j个位置,而第一个牛在k个位置,很明显了,其实不过是枚举。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string.h> #include <queue> #include <cmath> #include <vector> using namespace std; struct Point { int x,y; Point(int xx,int yy){x=xx,y=yy;} }; vector<Point>v[110]; int n; double dp[110][45][45]; double dist(int x,int y,int xx,int yy){ double xt=x-xx; double yt=y-yy; return sqrt(xt*xt+yt*yt); } int main(){ int k,x,y; while(scanf("%d",&n)!=EOF){ memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ v[i].clear(); scanf("%d",&k); for(int p=1;p<=k;p++){ scanf("%d%d",&x,&y); v[i].push_back(Point(x,y)); } } int psz=v[1].size(),psw=v[2].size(),psy; for(int i=0;i<psz;i++){ for(int k=0;k<psw;k++){ dp[2][k][i]=dist(v[1][i].x,v[1][i].y,v[2][k].x,v[2][k].y); } } for(int i=3;i<=n;i++){ psy=v[i].size(); psw=v[i-1].size(); for(int k=0;k<psz;k++){ for(int p=0;p<psy;p++){ dp[i][p][k]=dist(v[i][p].x,v[i][p].y,v[i-1][0].x,v[i-1][0].y)+dp[i-1][0][k]; for(int t=1;t<psw;t++) dp[i][p][k]=min(dp[i][p][k],dist(v[i][p].x,v[i][p].y,v[i-1][t].x,v[i-1][t].y)+dp[i-1][t][k]); } } } double ans=1e10; psw=v[n].size(); for(int i=0;i<psw;i++){ for(int j=0;j<psz;j++){ ans=min(ans,dp[n][i][j]+dist(v[n][i].x,v[n][i].y,v[1][j].x,v[1][j].y)); } } printf("%d\n",int(100*ans)); } }