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));
	}
}

	

  

posted @ 2015-02-19 23:15  chenjunjie1994  阅读(153)  评论(0编辑  收藏  举报