• 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 取的是最小值!
  • 相关阅读:
    Apache Tomcat开机后台启动
    android res文件夹下面的 values-v11 、 values-v14
    view.performClick()触发点击事件
    android Java BASE64编码和解码一:基础
    Android 正则表达式
    Android 中的Json解析工具fastjson 、序列化、反序列化
    Android 5中不同效果的Toast
    Android 中的编码与解码
    Android Http请求框架二:xUtils 框架网络请求
    Android-Universal-Image-Loader 框架使用
  • 原文地址:https://www.cnblogs.com/FXY-180/p/9370325.html
Copyright © 2020-2023  润新知