题目链接: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]

顺便一提,动态规划在这里大概写一下经验:

  1. 面对难以分析(转移)的状态,试着规定范围或顺序。

    如dp[i]表示0~i下的代价,dp[i][j]为凸包上点ij连成的线段,分割凸包的从i到j的一部分(规定了上下凸壳)
  2. 通常情况下的区间问题,一般首先通过二分做分析。

    与上面的方法略有相同之处,这里同样可以规定ij的顺序(i在mid左边,j在mid右边),更容易入手。

    二分有着很好的复杂度,我们在不超时的情况下,通过给定的ij顺序甚至可以做任何事情,当然必须考虑合并区间问题。
  3. 在确定状态前,可以分析目标函数来尝试逆推转移方程。

    比如矩阵链乘问题,目标函数是$$ \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 动态规划 难以确定的状态的更多相关文章

  1. ACM - 动态规划 - UVA 1347 Tour

    UVA 1347 Tour 题解 题目大意:有 \(n\) 个点,给出点的 \(x\).\(y\) 坐标.找出一条经过所有点一次的回路,从最左边的点出发,严格向右走,到达最右点再严格向左,回到最左点. ...

  2. UVA 1347 Tour 【双调旅行商/DP】

    John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...

  3. UVa 1347 Tour

    Tour Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description   Joh ...

  4. UVA - 1347 Tour(DP + 双调旅行商问题)

    题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径. 分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目 ...

  5. UVA 1347 Tour 双调TSP

    TSP是NP难,但是把问题简化,到最右点之前的巡游路线只能严格向右,到最右边的点以后,返回的时候严格向左,这个问题就可以在多项式时间内求出来了. 定义状态d[i][j]表示一个人在i号点,令一个人在j ...

  6. UVA 1347"Tour"(经典DP)

    传送门 参考资料: [1]:紫书 题意: 欧几里得距离???? 题解: AC代码: #include<bits/stdc++.h> using namespace std; ; int n ...

  7. UVa 1347 (双线程DP) Tour

    题意: 平面上有n个坐标均为正数的点,按照x坐标从小到大一次给出.求一条最短路线,从最左边的点出发到最右边的点,再回到最左边的点.除了第一个和最右一个点其他点恰好只经过一次. 分析: 可以等效为两个人 ...

  8. Tour UVA - 1347

    John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...

  9. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

随机推荐

  1. 常用的GNOME Shell 扩展

    GNOME Shell(即GNOME 3)桌面环境最初进军Linux世界时,众多批评人士指出其灵活性有所欠缺.当初外观有所突破的GNOME确实会给生产效率带来一些影响,然而它多年来一直默默通过多种方式 ...

  2. JS使用三元运算符判断三个数中最大的数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算

    题解: 首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值. 不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这 ...

  4. python位操作(进制)与ascii

    位操作符 位操作的操作符与python的set的操作符一样.与C语言中的位操作符也是一样的. a = 60 #60的二进制为 0011 1100b = 13 #13的二进制为 00001101 c = ...

  5. 如何用IE打开Chrome浏览器

    实现方式,用IE调用cmd命令打开chrome(注意:IE的ActiveX相关设置要启用) <script type="text/javascript"> functi ...

  6. NOIP2013 华容道 (棋盘建图+spfa最短路)

    #include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...

  7. JSp获取到当前用户的全部session

    <%@page import="java.util.Enumeration"%> <% for (Enumeration<?> e = session ...

  8. Vue常用的GitHub项目

    Vue常用的GitHub项目(Demo案例) 应用实例 https://github.com/pagekit/pa... pagekit-轻量级的CMS建站系统 https://github.com/ ...

  9. 命令行 对MYSQL导入sql

    1 use database name;  //选择使用的数据库 2 mysql>source d:\datafilename.sql  导入sql

  10. 2015级C++第2周实践项目

    [项目1 - 宣告"主权"] 你已经是CSDN博客主了,用IT人特有的方式,编一段程序.在屏幕上输出你想说的话.按要求公布博文,作为我们的开山之作. [项目2 - 胖子不想说体重] ...