友好城市

https://www.acwing.com/problem/content/1014/

最近在复习这块。突然感觉这题也没那么难想。
和y总讲的略有出入,结果一致,但思路更自然。

联系到我们的序列切割模型,把航线看成切割。我们第一步很容易得出状态
f[i][j]表示从(值域)1~i, 1~j中选,且(i, j)配对的最大条数。

\[f[i][j] = max(f[i - 1, j], f[i, j - 1], f[i - 1][j - 1] + val(i, j)(有航线1,无航线-INF) \]

复杂度:\(O(L^2)\)(L是值域)


由于我们不关心每条航线具体什么值,而只关心大小关系,做第一步优化(离散化):
排序完了做就行。
复杂度:\(O(n^2)\)


联系到只有航线切割序列,何不直接以航线为状态(不用离散化了)?
f[i]表示最后一条航线为i的配对最大条数

\[f[i] = 1 + max_{a_y < a_x, b_y < b_x}(f[y]) \]


按什么顺序转移呢?
可以直接排序吧。
将航线视为二元组的集合,要找⼀个下标子序列,使其上\(a\),\(b\)都递增。
直接把\(a\)递增排出来,那要求的就是b的最长上升子序列!!!

复杂度:\(O(nlogn)\)

posted @ 2024-04-25 11:45  琴忆庭  阅读(3)  评论(0编辑  收藏  举报