C++ 城市路径

#include<iostream>
using namespace std;
const int MAXN=100001;
pair<int,int>coor[MAXN];
int d(int a,int b)
{
    return abs(coor[a].first-coor[b].first)+abs(coor[a].second-coor[b].second);
}
int main()
{
    int n,;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>coor[i].first>>coor[i].second;
    }
    int sum=0;
    for(int i=2;i<=n;++i)
    {
        sum=sum+d(i,i-1);
    }
    int ans=sum;
    for(int j=2;j<n;++j)
    {
        ans=min(ans,sum-d(j,j-1)-d(j+1,j)+d(j-1,j+1));
    }
    cout<<ans;
   return 0;
}

代码先放上!

试题描述:

地图上有 n 个城市,一只奶牛要从 1 号城市开始依次经过这些城市,最终到达 n 号城市。但是这只奶牛觉得这样太无聊了,所以它决定跳过其中的一个城市(但是不能跳过 1 号和 n 号城市),使得它从1号城市开始,到达 n 号城市所经过的总距离最小。假设每一个城市 i 都有一个坐标(xi yi),从(x1y1)的城市 1 到(x2y2)的城市 2 之间的距离为|x1-x2|+|y1-y2|。

输入:

第1行1个正整数 n ,表示城市个数。
接下来 n 行,每行 2 个数 xi 和 yi ,表示城市 i 的坐标。

输出:

一行一个数,使得它从1号城市开始,跳过某一个城市,到达 n 号城市所经过的最小总距离。

输入实例:

4
0 0
8 3
11 -1
10 0

输出实例:
14

这是一道递推,对这是递推!!!

那就让我们来推一下吧!
先设f(i)为从城市1跳到城市i的距离和,设g(i)为从城市i跳到城市n的距离和,那么答案就可以写出来了! min(f(i-1)+g(i+1)+dis[i-1][i+1])
其中dis[i-1][i+1]表示城市i-1到城市i+1的曼哈顿距离,f(i)和g(i)都可以用递推预处理求出:f(i)=f(i-1)+dis[i-1][i],g(i)=g(i+1)+dis[i][i+1];
也可以设f(i)表示从城市1以此到城市n且跳过城市i的距离之和,sum表示从城市1以此跳到城市n的距离之和,则f(i)=min(sum-dis[i,i-1]-dis[i+1,i]+dis[i-1,i+1].
科普一下 min 取的是最小值!
原文地址:https://www.cnblogs.com/FXY-180/p/9370325.html