#贪心 ## 题目大意 给定一个 $n\times m$ 的矩阵,要选择两条 $(1,1)$ 到 $(n,m)$ 的路径,要求每次都只能往下面或者右边一个格子走。现在你需要求出这两条路径的最小前缀。 ## 思路 首先,题目告诉了我们每一个格子只能往下面或者右边走,因此路径的长度一定为 $n+m-1$,也可以将矩阵斜着切分为 $n+m-1$ 个格子。既然是最大前缀最小,那么只需要有斜排有不一样的元素就可以了,这样子我们就可以专门走不一样的格子,使得答案尽量小。 至于如何存储每一斜排的所有元素,可以使用 STL 当中的 unordered_set 实现。注意需要特殊判断矩阵当中全是同一个字符的情况,其实循环到 $n+m$ 就行了。时间复杂度 $\mathcal O(n\times m)$。 ## 代码 ```cpp #include <iostream> #include <unordered_set> using namespace std; const int kMaxN = 2e3 + 5; int n, m; char c; unordered_set<char> s[kMaxN * kMaxN]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> c, s[i + j - 1].insert(c); } } for (int i = 1; i <= n + m; i++) { if (s[i].size() != 1) { return cout << i - 1, 0; } } return 0; } ```