UVA 1347 Tour - 简单dp
2016-03-26 15:35
381 查看
题目描述
<=>从左边有两个人一起向右边走,不重复经过点,求最短路。
dp[x][y] : 第一个人在x,第二个人在y点,[1,max(x,y)]的点一定已经走过的最短路。
由于dp[x][y]=d[y][x],规定x>=y
dp[x][y]=min(dp[x][y],dp[x-1][y]+dist[x-1][x])
dp[x][x-1]=min(dp[x][x-1],dp[x-1][k]+dist[k][x]) 1<=k<=i-1
分析:
从左边走到右边,再从右边走到左边,不重复经过点,求最短路。<=>从左边有两个人一起向右边走,不重复经过点,求最短路。
dp[x][y] : 第一个人在x,第二个人在y点,[1,max(x,y)]的点一定已经走过的最短路。
由于dp[x][y]=d[y][x],规定x>=y
dp[x][y]=min(dp[x][y],dp[x-1][y]+dist[x-1][x])
dp[x][x-1]=min(dp[x][x-1],dp[x-1][k]+dist[k][x]) 1<=k<=i-1
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define MAXN 1000 int n,a[MAXN+10][2]; double dist[MAXN+10][MAXN+10],dp[MAXN+10][MAXN+10]; double Getdist(int i,int j){ int x=a[i][0]-a[j][0],y=a[i][1]-a[j][1]; return sqrt(x*x+y*y); } void read() { for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]); for(int i=1;i<=n;i++) for(int j=1;j<i;j++) dist[i][j]=dist[j][i]=Getdist(j,i); } void DP() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=1e24; dp[2][1]=dist[1][2]; for(int i=3;i<=n;i++){ for(int j=1;j<i-1;j++) dp[i][j]=min(dp[i][j],dp[i-1][j]+dist[i-1][i]); for(int j=1;j<i-1;j++) dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+dist[j][i]); } printf("%.2lf\n",dp [n-1]+dist[n-1] ); } int main() { while(scanf("%d",&n)==1){ read(); DP(); } }
相关文章推荐
- 使用Ivy管理项目中的依赖
- SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)
- 2016腾讯春招模拟笔试
- java测试URL是否连通的方法
- 判断两个(float)变量x,z是否相等 以及和0值比较方法
- java工程师最新面试题(线程部分)
- 8款流行前沿的HTML5文本编辑器
- 字符串
- 20145218 《Java程序设计》第四周学习总结
- JS实现滚动监听以及滑动到顶部
- struts的DevMode模式问题
- 调试angularjs chrome 插件 Batarang安装和使用
- 用C语言实现大小端判断
- 微服务(Microservices)—Martin Flower【翻译】【转载】
- git 使用记录
- XAudio2采样率转换
- Java Vector 类
- Xp系统下查看计算机所有程序的方法
- mongodb技巧总结
- 大整数相乘(包含小数)