A. Wiggle Walk
难度 模拟,编码,hashtable
这个题比较简单,可以直接模拟,用一个 hashtable
维护 dp[x][y][dir] [注意这里不是开数组], 因为只有
N
≤
5
e
4
N \le 5e4
N≤5e4 个点所以用hashtable维护就好,复杂度
O
(
n
)
O(n)
O(n)
code : github
B. Circuit Board
难度 RMQ
每一行都是独立的,因此可以枚举列
for(int l = 0 ; l< c ; ++l)
for(int r=l ; r < c ; ++r)
compute best ans
这里需要判断每一行是否满足 max a i [ l , … , r ] − min a i [ l , … , r ] > k \max a_i[l,\dots,r] - \min a_i[l,\dots,r] >k maxai[l,…,r]−minai[l,…,r]>k 因此需要快速求 [l,r] 的最大最小值,这个不就是经典的 RMQ 吗?
code : github
C. Catch Some
难度 dp,0/1 knapstack
这题是一个类似 0/1 背包的dp
一点变化是最后不需要回到原点,因此最后观察的dog是一个关键,也就是对每个type来说最后一种type是有差别的,其他没差别。
这里我借鉴了 No.1 大哥的是做法,
对于 M M M 种type A 1 , … , A M A_1,\dots,A_M A1,…,AM, 计算两个方向的dp
l d p [ i ] [ k ] ldp[i][k] ldp[i][k] 仅仅考虑前 i i i 种类型,并且都是要回到原点,取 k k k 个dog的最优解。 O ( n 2 ) O(n^2) O(n2) (注意这里复杂度计算还是有一些trick的,因为对于每一个dog仅仅会考虑一次,而总共有 k k k 种观测,所以复杂度为 O ( n 2 ) O(n^2) O(n2))
r d p [ i ] [ k ] rdp[i][k] rdp[i][k] 仅仅考虑后 i i i 种类型,并且都回到原点,取 k k k 个dog 的最优解
最后考虑每一个dog作为终点的情款的最优解就好了
这里总结一个 离散化的模板
// discretize a vector
//
// example:
// 1,10,3,5 -> 0,3,1,2
// NOTE: re-write parameter, not functional
// return : number of non-duplicated elements
int discretization(vector<int> & raw){
// discretization
vector<int> id = raw;
sort(id.begin(),id.end());
auto it_end = unique(id.begin() , id.end());
for(int i=0 ; i<raw.size() ; ++i)
raw[i] = lower_bound(id.begin(),it_end,raw[i]) - id.begin();
return it_end - id.begin();
}
code github
版权声明
本作品为作者原创文章,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
作者: taotao
转载请保留此版权声明,并注明出处