题目链接: 2686:滑雪 (tzcoder.cn)
思路: 记忆化搜索。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//#define int long long
#define ios ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
const int N = 1e2+5;
int r, c, a[N][N];
int vis[N][N], dp[N][N];
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
void dfs(int x, int y){
for(int i = 0; i < 4; i++){
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if(dx < 1 || dy < 1 || dx > r || dy > c || a[dx][dy] >= a[x][y]) continue;
if(vis[dx][dy]) {
dp[x][y] = max(dp[x][y], dp[dx][dy] + 1);
}else{
dfs(dx, dy);
dp[x][y] = max(dp[x][y], dp[dx][dy] + 1);
}
vis[x][y] = 1;
}
}
void solve(){
//cout << r <<" " << c << endl;
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
cin >> a[i][j];
dp[i][j] = 1;
vis[i][j] = 0;
}
}
int ans = 0;
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
if(!vis[i][j]){
dfs(i, j);
ans = max(ans, dp[i][j]);
}
}
}
cout << ans << endl;
}
signed main(){
ios; int _;
_ = 1; //cin >> _;
while(cin >> r >> c){
solve();
}
return 0;
}