滑雪最暴力做法bfs 过了9/12个点,做法不可取
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 310;
typedef pair<int, int> PII;
int g[N][N], dist[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void bfs(int st, int ed)
{
queue<PII> q;
q.push({st, ed});
while(q.size())
{
PII t = q.front();
q.pop();
for(int i = 0; i < 4; i ++)
{
int xx = t.x + dx[i];
int yy = t.y + dy[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < m &&
g[xx][yy] < g[t.x][t.y])
{
dist[xx][yy] = max(dist[t.x][t.y] + 1, dist[xx][yy]);
q.push({xx, yy});
}
}
}
}
int main()
{
cin >> n >> m;
//输入地图
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
scanf("%d", &g[i][j]);
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
bfs(i, j);
int res = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
res = max(res, dist[i][j]);
cout << res + 1 << endl;
return 0;
}
最终做法使用dfs记忆化搜索
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 310;
int f[N][N], g[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dp(int x, int y)
{
int &v = f[x][y];
if(v != -1) return v;
v = 1;
for(int i = 0; i < 4; i ++)
{
int xx = x + dx[i], yy = y + dy[i];
if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && g[xx][yy] < g[x][y])
v = max(v, dp(xx, yy) + 1);
}
return v;
}
int main()
{
cin >> n >> m;
//输入每个滑雪场的高度
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &g[i][j]);
memset(f, -1, sizeof f);
int res = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
res = max(res, dp(i, j));
cout << res << endl;
return 0;
}