Update CMakeLists.txt

This commit is contained in:
2026-09-05 11:05:50 +08:00
parent 94bdf44889
commit a7a78fbac8
22 changed files with 1339 additions and 52 deletions
+110
View File
@@ -0,0 +1,110 @@
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int x, y, height;
};
constexpr int MAX_N = 105;
constexpr short DX[4] = {0, 1, 0, -1}, DY[4] = {1, 0, -1, 0};
int r, c;
int heights[MAX_N][MAX_N];
vector<int> adj_nodes[MAX_N * MAX_N];
vector<Node> nodes;
int dp[MAX_N * MAX_N];
int pack_coord(int x, int y) {
return x * c + y;
}
int pack_coord(Node node) {
return pack_coord(node.x, node.y);
}
bool within_board(int x, int y) {
return 0 <= x && x < r && 0 <= y && y < c;
}
void log_dp() {
for (int i = 0; i < r * c; i++) {
clog << dp[i] << "\t";
if (i % c == c - 1) {
clog << endl;
}
}
}
void log_adj_nodes() {
for (int i = 0; i < r * c; i++) {
clog << i << " -> ";
for (int adj_node : adj_nodes[i]) {
clog << adj_node << " ";
}
clog << endl;
}
}
void init_adj_nodes() {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
nodes.push_back({i, j, heights[i][j]});
int x = i, y = j;
for (int k = 0; k < 4; k++) {
int nx = x + DX[k], ny = y + DY[k];
if (within_board(nx, ny) && heights[nx][ny] > heights[x][y]) {
// 反向建图,小 -> 大
adj_nodes[pack_coord(x, y)].push_back(pack_coord(nx, ny));
}
}
}
}
sort(nodes.begin(), nodes.end(), [](const Node& a, const Node& b) {
return a.height > b.height;
});
}
void solve_dp() {
dp[pack_coord(nodes[0])] = 1;
for (int i = 1; i < nodes.size(); i++) {
Node curr_node = nodes[i];
int max_dp = 0;
for (int adj_node : adj_nodes[pack_coord(curr_node)]) {
max_dp = max(max_dp, dp[adj_node]);
}
dp[pack_coord(curr_node)] = max_dp + 1;
}
}
int get_ans() {
int max_dp = -1;
for (int i = 0; i < r * c; i++) {
max_dp = max(max_dp, dp[i]);
}
return max_dp;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> r >> c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> heights[i][j];
}
}
init_adj_nodes();
solve_dp();
log_adj_nodes();
log_dp();
cout << get_ans() << endl;
return 0;
}