实现支持根据时间查询的map: set(string key, string value, int timestamp)和get(string key, int timestam。注意这道题和另一道让实现key带TTL的map题不一样。对每个key维持一个根据ts不断插入的List,然后二分找小于ts的value。或对每个key维持一个tree map, upper_bound(ts)找到第一个大于ts的value,prev一下就是最后一个小于ts的。tree map的insertion时间消耗为O(lgN),比list的O(1)长。
class Solution {
public:
int minManHaDis(vector<vector<int>> &ws, vector<vector<int>> &bs) {
int m = ws.size(), n = bs.size();//m <= n based on the question;
vector<vector<int>> memo(1<<m, vector<int>(1<<n, -1));
int state1 = 0, state2 = 0;
int res = dfs(0, ws, state1, bs, state2, memo);
//cout<<res<<endl;
return res;
}
private:
int dfs(int i, vector<vector<int>> &ws, int st1, vector<vector<int>> &bs, int st2, vector<vector<int>> &memo) {
if(i==ws.size()) return 0;//all the workers are assigned;
if(memo[st1][st2] != -1) return memo[st1][st2];//calculated;
int min_dis = INT_MAX;
for(int j = 0; j < bs.size(); ++j) {//try all the bikes;
if((st2>>j) & 1) continue;//if the bike is used;
int one_dis = abs(ws[i][0] - bs[j][0]) + abs(ws[i][1] - bs[j][1]);
one_dis += dfs(i+1, ws, st1 | (1<<i), bs, st2 | (1<<j), memo);//total dis in this case;
min_dis = min(min_dis, dis);//min distance;
}
return memo[st1][st2] = min_dis;//memorize min distance;
}
};