#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,有些城市之间有路相连,有些则没有,有路则会有一个距离。如图所示是一个含有11个城市的交通图,连线上的数表示距离。现在规定只能从编号小的城市到编号大的城市。问:从编号为1的城市到编号为n的城市的最短距离是多少?
输入:
第一行为n,表示城市数,n<=100。
下面n行是一个n*n的邻接矩阵map[i,j],其中map[i,j]=0表示城市i和j之间没有路相连,否则为两者之间的距离。
输出:
输出一个数,表示最短距离,保证有解。
输入示例:
11 0 5 3 0 0 0 0 0 0 0 0 5 0 0 1 6 3 0 0 0 0 0 3 0 0 0 8 0 4 0 0 0 0 0 1 0 0 0 0 0 5 6 0 0 0 6 8 0 0 0 0 5 0 0 0 0 3 0 0 0 0 0 0 0 8 0 0 0 4 0 0 0 0 0 0 3 0 0 0 0 5 5 0 0 0 0 0 3 0 0 0 6 0 0 0 0 0 0 4 0 0 0 0 0 8 3 0 0 0 3 0 0 0 0 0 0 0 3 4 3 0
输出示例:
13
本体为DP(动态规划)!!!!!!
和前面那两题(最长子序列,0-1背包)的思维方式基本相同:
逆向思维!
现在可以把问题化简:如图,要从城市1到城市11,只能从8,9,10,三个城市经过,所以要求出从城市1到城市8,9,10分别所需的距离,那么只需要把这三个最短距离加上这三个城市与城市11的最短距离;
所以新的问题又产生了,分别到城市8,9,10的最短距离又是什么呢?
这是城市8,9,10又引出了新的城市4,5,6,7;
再由4,5,6,7引出了城市2,3; 而城市2,3引出了城市1;——这样问题就被分为了多个小问题,解决小问题当让是要比解决大问题要简单而且更加清晰且显而易见的了;
不要忘记打擂台取最小值(本题可以用搜索解决哦)!!!!
逆向思维(!!!!)