码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2137

时间:2015-02-20 00:04:15      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

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

	

  

POJ 2137

标签:

原文地址:http://www.cnblogs.com/jie-dcai/p/4296350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!