题目:http://community.topcoder.com/stat?c=problem_statement&pm=12468&rd=15493
题目的难点是要把题目转化成求解最短路径模型。参考一位大牛的话:
Make the pair: (hill, altitude) to represent a node.
you need to find the shortest path from
(0, any_altitude) to (n-1, any_altitude)
Next trick is to observe the altitudes that matter are the ones from vector A (altitudes).
Now a node is (hill, j) (you are at hill with Altitude A[j]). Run the your shortest path algorithm...
代码:
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> pll;
#define mkp make_pair
/*************** Program Begin **********************/
int g[55][55];
const long long INF = (1LL << 60);
long long dist[51][51]; // dist[i][j] 表示 节点(0, 0) 至 (i, j)的最短距离
class SkiResorts {
public:
vector <int> altitude;
inline int distance(int i, int j) {return abs(altitude[i] - altitude[j]);}
long long minCost(vector <string> road, vector <int> altitude) {
long long res = INF;
this->altitude = altitude;
int n = road.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (road[i][j] == ‘Y‘) {
g[i][j] = 1;
} else {
g[i][j] = 0;
}
dist[i][j] = INF;
}
}
// Dijk 算法
set < pair<int, pii> > S;
for (int i = 0; i < n; i++) {
// add start nodes
dist[0][i] = distance(0, i);
S.insert( mkp(dist[0][i], mkp(0, i)) );
}
pair<int, pii> cur;
while (!S.empty()) {
cur = *S.begin();
S.erase(S.begin());
int p = cur.second.first;
int h = cur.second.second;
for (int i = 0; i < n; i++) {
// 更新相邻节点 i
if (!g[p][i]) { continue; }
for (int j = 0; j < n; j++) { // (p, h) -> (i, j)
if (altitude[h] >= altitude[j] &&
dist[i][j] > dist[p][h] + distance(i, j) ) {
S.erase(mkp(dist[i][j], mkp(i, j)));
dist[i][j] = dist[p][h] + distance(i, j);
S.insert(mkp(dist[i][j], mkp(i, j)));
}
}
}
}
for (int i = 0; i < n; i++) {
res = min(res, dist[n-1][i]);
}
res = (res == INF ? -1 : res);
return res;
}
};
/************** Program End ************************/
SRM 573 D1L2:SkiResorts,最短路径算法,布布扣,bubuko.com
SRM 573 D1L2:SkiResorts,最短路径算法
原文:http://blog.csdn.net/xzz_hust/article/details/20392187