OpenJ_Bailian - 1088 滑雪(记忆化搜索)
2024-10-08 14:12:20
题意:给定一个二维数组,一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,输出可以滑行的最长区域的长度。
分析:对于每一个点,进行记忆化搜索。若某点可以向四周某几个点滑行,记忆化搜索求出这几个可滑行点的最长滑行长度,取最大值,则该点的最长滑行长度为最大值+1.
注意:不能直接dp[x][y]=max(dp[x][y],dfs(tmpx,tmpy)+1),因为若四周没有可滑行的点,则该点最长滑行长度dp[x][y]会输出0,而实际dp[x][y]为1,分析中的方法可避免这个问题。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 100 + 10;
int pic[MAXN][MAXN];
int dp[MAXN][MAXN];
const int dr[] = {0, 0, 1, -1};
const int dc[] = {1, -1, 0, 0};
int R, C;
bool judge(int x, int y){
return x >= 0 && x < R && y >= 0 && y <= R;
}
int dfs(int x, int y){
if(dp[x][y]) return dp[x][y];
int ans = 0;
for(int i = 0; i < 4; ++i){
int tmpx = x + dr[i];
int tmpy = y + dc[i];
if(judge(tmpx, tmpy) && pic[tmpx][tmpy] < pic[x][y]){
ans = max(ans, dfs(tmpx, tmpy));
}
}
return dp[x][y] = ans + 1;
}
int main(){
scanf("%d%d", &R, &C);
for(int i = 0; i < R; ++i){
for(int j = 0; j < C; ++j){
scanf("%d", &pic[i][j]);
}
}
int ans = 0;
for(int i = 0; i < R; ++i){
for(int j = 0; j < C; ++j){
ans = max(ans, dfs(i, j));
}
}
printf("%d\n", ans);
return 0;
}
最新文章
- 背后的故事之 - 快乐的Lambda表达式(二)
- 【项目】百度搜索广告CTR预估
- Sublime Text 2 中文 GBK 规范的配置 暨 解决中文乱码问题 简述
- [Javascript] The Array filter method
- Java日期相关操作
- struts2+hibernate环境搭建
- CentOS下Samba服务器的配置
- MFC设置窗体大小SetWindowPos
- jvm系列 (三) ---锁的优化
- Elasticsearch 索引别名与Template
- reduce 方法 (Array) (JavaScript)
- Spring mvc整合freemarker详解
- windows2012服务器中安装php7+mysql5.7+apache2.4环境
- D3DX 9.9 LEARNERNOTO
- JS重点整理之JS原型链彻底搞清楚
- 英语口语练习系列-C34-儿童-谈论物品和人-武陵春
- springmvc访问项目默认先访问后台再返回首页
- c++ malloc与free
- vue---阻止默认表单提交的三种方法
- Linux入门之vi