#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 取的是最小值!