ac了
```cpp
#include <bits/stdc++.h>
using namespace std;
const int maxsize = 110;
struct eage {
int x, h;
} p[maxsize * maxsize];
int d[3][3];
int n, m, ans, mn;
int f[maxsize * maxsize];
bool cmp(eage x, eage y) {
return x.h > y.h;
}
bool check(int i, int j) {
int t[3][3] = {{0, 0, 0}, {0, -m, m}, {0, -1, 1}};
bool flag1 = (p[i].x <= m);//第一行
bool flag2 = (p[i].x % m == 1); //第一列
bool flag4 = (p[i].x % m == 0);//第m列
bool flag3 = (p[i].x / m + 1 == n && !flag4 || p[i].x == m * n); //第n行
if (flag1)
t[1][1] = 0;
if (flag2)
t[2][1] = 0;
if (flag3)
t[1][2] = 0;
if (flag4)
t[2][2] = 0;
//printf("%d %d %d %d %d\n", p[i].h, flag1, flag2, flag3, flag4);
for (int k = 1; k <= 2; k++)
if ((p[i].x + t[k][1] == p[j].x || p[i].x + t[k][2] == p[j].x) && p[i].h < p[j].h)
return 1;
return 0;
}
int dp() {
int ans = 0;
for (int i = 1; i <= mn; i++) {
for (int j = i - 1; j; j--)
if (check(i, j))
f[i] = max(f[i], f[j] + 1);
//cout << "f[" << i << "] = " << f[i] << endl;
ans = max(ans, f[i]);
}
return ans;
}
int main() {
cin >> n >> m;
d[1][1] = -m;
d[1][2] = m;
d[2][1] = -1;
d[2][2] = 1;
mn = m * n;
for (int i = 1; i <= mn; i++) {
cin >> p[i].h;
p[i].x = i;
f[i] = 1;
}
sort(p + 1, p + 1 + mn, cmp);
int ans = dp();
cout << ans;
return 0;
}
```
by it_hard_to_name @ 2022-07-23 10:47:33