题意:

双调欧几里得旅行商问题。

思路:

dp。定义dp[i][j](i <= j)为从点j从右向左严格按照x坐标递减顺序走到点1,之后再从点1从左向右严格按照x坐标递增的顺序走到点i,并且在此过程中经过且仅经过1到j之间所有的点1次。则

dp[1][2] = dis[1][2];

dp[i][j] = dp[i][j - 1] + dis[j - 1][j]; (i < j - 1)

dp[i][j] = min(dp[k][j - 1] + dis[k][j]). (1 <= k < j - 1, i == j - 1)

最终,dp[n][n] = dp[n - 1][n] + dis[n - 1][n].

实现:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std; const int MAXN = , INF = 0x3f3f3f3f;
double dp[MAXN + ][MAXN + ], dis[MAXN + ][MAXN + ];
int n, x[MAXN + ], y[MAXN + ]; int square(int x)
{
return x * x;
} void init()
{
for (int i = ; i <= n; i++)
{
for (int j = i + ; j <= n; j++)
{
dis[i][j] = sqrt(square(x[i] - x[j]) + square(y[i] - y[j]));
}
}
} double solve()
{
dp[][] = dis[][];
for (int j = ; j <= n; j++)
{
// i < j - 1
for (int i = ; i <= j - ; i++)
{
dp[i][j] = dp[i][j - ] + dis[j - ][j];
}
// i == j - 1
dp[j - ][j] = INF;
for (int k = ; k <= j - ; k++)
{
dp[j - ][j] = min(dp[j - ][j], dp[k][j - ] + dis[k][j]);
}
}
return dp[n][n] = dp[n - ][n] + dis[n - ][n];
} int main()
{
while (cin >> n)
{
for (int i = ; i <= n; i++)
{
cin >> x[i] >> y[i];
}
init();
printf("%.2f\n", solve());
}
return ;
}

总结:

假设一个最优选择,然后再基于该最优选择来定义问题,是动态规划的惯用手法。

poj2677 Tour的更多相关文章

  1. POJ2677 Tour[DP 状态规定]

    Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4307   Accepted: 1894 Description ...

  2. POJ2677 Tour(DP+双调欧几里得旅行商问题)

    Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3929   Accepted: 1761 Description ...

  3. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

  4. Euler Tour Tree与dynamic connectivity

    Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...

  5. soj 1015 Jill's Tour Paths 解题报告

    题目描述: 1015. Jill's Tour Paths Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Every ...

  6. poj1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8859   Accepted: 3728 ...

  7. A quick tour of JSON libraries in Scala

    A quick tour of JSON libraries in Scala Update (18.11.2015): added spray-json-shapeless libraryUpdat ...

  8. POJ 1637 Sightseeing tour (混合图欧拉路判定)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6986   Accepted: 2901 ...

  9. POJ 1637 Sightseeing tour (混合图欧拉回路)

    Sightseeing tour   Description The city executive board in Lund wants to construct a sightseeing tou ...

随机推荐

  1. android按压背景

    android:background="?android:actionBarItemBackground"

  2. [Selenium] 操作浏览器前进后退

    driver.get("http://1.com"); driver.navigate().to("http://2.com"); driver.navigat ...

  3. [SDOI 2008] 洞穴勘测

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2049 [算法] LCT动态维护森林连通性 时间复杂度 : O(NlogN ^ 2) ...

  4. NOIP前的水题记录

    CF147B Smile House 二分+矩阵快速幂,注意一下储存矩阵相乘结果的矩阵,初始化时,a[i][i]=-inf(而其他都可以a[i][i]=0,为了保证答案的可二分性). CF715B C ...

  5. bzoj 2836 魔法树 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...

  6. bzoj3270博物馆——期望概率DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3270 设计一个状态表示两个人分别在两个点的状态,带个标号num[i][j]: 据此得到状态之 ...

  7. return break contiune

    return 会直接跳出当前作用域,继续执行下面的方法:在js中for循环没有局部作用域的概念,所以如果是多级循环会直接跳出所有的循环: demo for(var i=0; i<10; i++) ...

  8. C++ 指针p1 p2,p1-p2 与*p1-*p2的区别

    p1-p2 指 指针的地址值相减,计算两个指针之间的偏移量 *p1-*p2 指 指针指向的内存地址里面存的数值相减

  9. 任务28:RequestDelegate管道实现思路

    任务28:RequestDelegate管道实现思路 管道的实现机制 RequestDelegate是管道的核心.ApplicationBuilder就是接收了很多个RequestDelegae把它拼 ...

  10. 一个NodeJS写的基于MVC的服务器

    目前实现了静态文件下载.根据地址导航到控制器相应的控制器方法,但视图模版功能目前还未实现. 服务器代码(httpserver.js): var http = require("http&qu ...