POJ 2137 DP
2016-07-28 21:31
429 查看
思路:
枚举第一个点集中起点是哪个。 因为第i个点集总和第i-1个点集和第i+1个点集相连。 我们就可以DP求出最优解了。
f[i][j]=min(f[i][j],f[i-1][k]+dis(i,j,i-1,k));
枚举第一个点集中起点是哪个。 因为第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)); }
相关文章推荐
- Flex Namespace的用法
- ajax使用不同namespace的action的方法
- 浅谈几种常见语言的命名空间(Namespace)
- thinkphp autoload 命名空间自定义 namespace
- PHP命名空间(namespace)的使用基础及示例
- php中namespace use用法实例分析
- 浅析JavaScript中命名空间namespace模式
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- C++ namespace相关语法实例分析
- PHP命名空间(Namespace)简明教程
- PHP命名空间(Namespace)的使用详解
- JavaScript创建命名空间(namespace)的最简实现
- ASP.Net中命名空间Namespace浅析和使用例子
- LFC1.0.0 版本发布
- C++ 匿名namespace的作用以及它与static的区别
- Android dpi,dip,dp的概念以及屏幕适配
- 浅析JavaScript中命名空间namespace模式
- 这个小例子也许能帮助大家理解一下SIGUSR1的用法