P1434 [SHOI2002]滑雪
https://www.luogu.com.cn/problem/P1434
思路:当前位置的长度等于周围位置(该位置小于当前位置的数值并位于当前位置的上下左右四个位置)的长度的最大值加1。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int R, C;
vector<vector<int>>ans(100, vector<int>(100, 0));
struct node {
int y, x, val;
node(int y, int x, int val) :y(y), x(x), val(val) {}
node(){}
};
bool cmp(node A, node B) {
return A.val < B.val;
}
bool parse(int y, int x) {
if (y < 0 || x < 0 || y >= R || x >= C) return false;
return true;
}
//max[f(y+yi,x+xi)],(i=0,1,2,3)
int re_max(int y, int x, vector<vector<int>>&datas) {
int ret = 0;
int move[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
for (int i = 0; i < 4; i++) {
int yi = y + move[i][0];
int xi = x + move[i][1];
if (parse(yi, xi) && datas[y][x] > datas[yi][xi] && ret < ans[yi][xi]) {
ret = ans[yi][xi];
}
}
return ret;
}
int main() {
int data;
cin >> R >> C;
vector<vector<int>>datas(R, vector<int>(C));
vector<node>index;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> data;
datas[i][j] = data;
index.push_back(node(i, j, data));
}
}
sort(index.begin(), index.end(), cmp);
int max = 0;
for (int i = 0; i < index.size(); i++) {
node p = index[i];
int y = p.y, x = p.x;
//f(y,x)=max[f(y+yi,x+xi)]+1
ans[y][x] = re_max(y, x, datas) + 1;
if (max < ans[y][x])max = ans[y][x];
}
cout << max << endl;
return 0;
}