POJ 2137 DP
2016-07-28 21:31
225 查看
思路:
枚举第一个点集中起点是哪个。 因为第i个点集总和第i-1个点集和第i+1个点集相连。 我们就可以DP求出最优解了。
f[i][j]=min(f[i][j],f[i-1][k]+dis(i,j,i-1,k));
// by SiriusRen #include <cmath> #include <cstdio> #include <algorithm> using namespace std; int n,num[105]; double f[105][44],ans=0x3ffffff; struct Point{int x,y;}point[105][44]; double dis(int x1,int y1,int x2,int y2){ double tempx=1.0*(point[x1][y1].x-point[x2][y2].x)*(point[x1][y1].x-point[x2][y2].x); double tempy=1.0*(point[x1][y1].y-point[x2][y2].y)*(point[x1][y1].y-point[x2][y2].y); return sqrt(tempx+tempy); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&num[i]); for(int j=1;j<=num[i];j++) scanf("%d%d",&point[i][j].x,&point[i][j].y); } for(int l=1;l<=num[1];l++){ for(int i=1;i<=n;i++) for(int j=1;j<=num[i];j++) f[i][j]=0x3ffffff; f[1][l]=0; for(int i=2;i<=n;i++) for(int j=1;j<=num[i];j++) for(int k=1;k<=num[i-1];k++) f[i][j]=min(f[i][j],f[i-1][k]+dis(i,j,i-1,k)); for(int i=1;i<=num ;i++) ans=min(ans,f [i]+dis(n,i,1,l)); } printf("%d\n",int(ans*100)); }
相关文章推荐
- 如何获取浏览器URL中查询字符串的参数
- Linux常用命令
- 【HDU】1575 - Tr A(矩阵快速幂)
- HDU 5773 The All-purpose Zero(DP)
- Mysql异常:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
- android 自定义View开发实战(一) CustomTitleView
- SharedPreferences封装类SPUtils
- Saving HDU(贪心)
- sql server优化
- Java栈,队列,优先队列的使用
- [已解决]Could not allocate CursorWindow '' of size of size 2097152 due to error -12.
- Scanner类输入
- 论文笔记 | FaceNet: A Unified Embedding for Face Recognition and Clustering
- 网络预约出租汽车经营服务管理暂行办法发布
- 网络预约出租汽车经营服务管理暂行办法发布
- Xml利用Pull解析
- 自我介绍
- Java源码阅读-StringBuffer
- 用sparkR, 分析上亿条订单数据的脚本。
- HDU 2112 HDU Today【最短路+map容器,spfa算法+Dijkstra算法】