UVA-1347 Tour 动态规划 难以确定的状态
题目链接:https://cn.vjudge.net/problem/UVA-1347
题意
给出按x坐标排序的几个点。
欲从最左边不回头的走到最右边,然后再返回最左边。
每个点都要被访问,且只能经过一次。
问最小路程是多少。
n<=1000
思路
紫书动规学习中。
首先想到tsp的状压dp(O(n2*2n)),发现n超大,这一定不对。
然后就没有什么正经思路了。
首先发现每个x坐标都不同,且又存在两条路,
那么可以把问题转换一下,问两个人从最左走不同节点到达最右的总路程。
设d(i, j)为走过前i个节点,另一个人现在在j节点时的总路程。
那么有转移方程 d(i, j)=min(d(i+1, j)+dist[i][i+!], d(i+1, i)+dist[j][i+1])
边界条件变成d(0, 0)=0; d(n-1, i)=dist[n-1][i]
顺便一提,动态规划在这里大概写一下经验:
- 面对难以分析(转移)的状态,试着规定范围或顺序。
如dp[i]表示0~i下的代价,dp[i][j]为凸包上点ij连成的线段,分割凸包的从i到j的一部分(规定了上下凸壳) - 通常情况下的区间问题,一般首先通过二分做分析。
与上面的方法略有相同之处,这里同样可以规定ij的顺序(i在mid左边,j在mid右边),更容易入手。
二分有着很好的复杂度,我们在不超时的情况下,通过给定的ij顺序甚至可以做任何事情,当然必须考虑合并区间问题。 - 在确定状态前,可以分析目标函数来尝试逆推转移方程。
比如矩阵链乘问题,目标函数是$$ \sum p_i p_k p_j $$
很明显的发现连加,那么转移方程很可能是dp[i][j]=min(dp[i][k]+dp[k][j]+w[i][j])
如果是连乘可能是dp[i][j]=min(dp[i][k]dp[k][j]w[i][j])
如果是单个值,方程可能是dp[i][j]=max(S[i][j], dp[i][k], dp[k+1][j])
甚至是等差比数列,我们可以通过预处理来算dp
提交过程
| AC |
代码
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1000+20;
int n, x[maxn], y[maxn];
double data[maxn][maxn], dist[maxn][maxn];
double dp(int i, int j){
if (i==n-1) return dist[j][n-1];
if (data[i][j]>0) return data[i][j];
data[i][j]=min(dp(i+1, i)+dist[j][i+1], dp(i+1, j)+dist[i][i+1]);
return data[i][j];
}
int main(void){
while (scanf("%d", &n)==1 && n){
for (int i=0; i<n; i++)
scanf("%d%d", &x[i], &y[i]);
for (int i=0; i<n; i++)
for (int j=i+1; j<n; j++)
dist[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
memset(data, -1, sizeof(data));
printf("%.2f\n", dp(0, 0));
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 769 | None | None | C++ 5.3.0 | 2018-08-06 05:10:25 |
UVA-1347 Tour 动态规划 难以确定的状态的更多相关文章
- ACM - 动态规划 - UVA 1347 Tour
UVA 1347 Tour 题解 题目大意:有 \(n\) 个点,给出点的 \(x\).\(y\) 坐标.找出一条经过所有点一次的回路,从最左边的点出发,严格向右走,到达最右点再严格向左,回到最左点. ...
- UVA 1347 Tour 【双调旅行商/DP】
John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...
- UVa 1347 Tour
Tour Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Description Joh ...
- UVA - 1347 Tour(DP + 双调旅行商问题)
题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径. 分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目 ...
- UVA 1347 Tour 双调TSP
TSP是NP难,但是把问题简化,到最右点之前的巡游路线只能严格向右,到最右边的点以后,返回的时候严格向左,这个问题就可以在多项式时间内求出来了. 定义状态d[i][j]表示一个人在i号点,令一个人在j ...
- UVA 1347"Tour"(经典DP)
传送门 参考资料: [1]:紫书 题意: 欧几里得距离???? 题解: AC代码: #include<bits/stdc++.h> using namespace std; ; int n ...
- UVa 1347 (双线程DP) Tour
题意: 平面上有n个坐标均为正数的点,按照x坐标从小到大一次给出.求一条最短路线,从最左边的点出发到最右边的点,再回到最左边的点.除了第一个和最右一个点其他点恰好只经过一次. 分析: 可以等效为两个人 ...
- Tour UVA - 1347
John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
随机推荐
- 凸多边形 HRBUST - 1429 计算几何_凸包_未调完
任选一个点作为起始点,将其他点按与该点连线的极角排序,二分查询点在哪两个射线之间, 并特别判断一下边界即可. Code: #include <cstdio> #include <al ...
- 加减法计算器-java
由于经常进行较大数据的加减法计算,好多计算器都是转换成科学技术法的,所以自己用java写了一个 功能如下: 1,可以输入多个带千位分隔符的数字,进行加减法计算 2,结果展示带千位分隔符 3,结果展示不 ...
- php 密码hash加密
做密码加密,记录一下. password_hash 函数在 PHP 5.5 时被引入. 此函数现在使用的是目前 PHP 所支持的最强大的加密算法 BCrypt .例子: $passwordHash = ...
- [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)
题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...
- 中国剩余定理(excrt) 模板
excrt板子题 #include <cmath> #include <cstdio> #include <cstring> #include <algori ...
- 【RHEL7/CentOS7防火墙之firewall-cmd命令详解】
目录 Firewalld zone firewall-cmd 开始配置防火墙策略 总结 Redhat Enterprise Linux7已默认使用firewalld防火墙,其管理工具是firewall ...
- 洛谷 P1518 两只塔姆沃斯牛 The Tamworth Two
P1518 两只塔姆沃斯牛 The Tamworth Two 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在1 ...
- servlet调用的几种方式
參见 文库/java/javaEE全新学习教程2.2节 1.通过URL调用 2通过提交表单 3超链接 4 javascript写一个函数,调用这个函数 1,首先在project的WebRoot目录下建 ...
- Android在程序中浏览网页
本文是自己学习所做笔记,欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 有时须要在程序中浏览一些网页.当然了能够通过调用系统的浏览器来打开浏览.可是大多 ...
- Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库
Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...