题意:给定一个二维数组,一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,输出可以滑行的最长区域的长度。

分析:对于每一个点,进行记忆化搜索。若某点可以向四周某几个点滑行,记忆化搜索求出这几个可滑行点的最长滑行长度,取最大值,则该点的最长滑行长度为最大值+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;
}

  

最新文章

  1. 背后的故事之 - 快乐的Lambda表达式(二)
  2. 【项目】百度搜索广告CTR预估
  3. Sublime Text 2 中文 GBK 规范的配置 暨 解决中文乱码问题 简述
  4. [Javascript] The Array filter method
  5. Java日期相关操作
  6. struts2+hibernate环境搭建
  7. CentOS下Samba服务器的配置
  8. MFC设置窗体大小SetWindowPos
  9. jvm系列 (三) ---锁的优化
  10. Elasticsearch 索引别名与Template
  11. reduce 方法 (Array) (JavaScript)
  12. Spring mvc整合freemarker详解
  13. windows2012服务器中安装php7+mysql5.7+apache2.4环境
  14. D3DX 9.9 LEARNERNOTO
  15. JS重点整理之JS原型链彻底搞清楚
  16. 英语口语练习系列-C34-儿童-谈论物品和人-武陵春
  17. springmvc访问项目默认先访问后台再返回首页
  18. c++ malloc与free
  19. vue---阻止默认表单提交的三种方法
  20. Linux入门之vi

热门文章

  1. 涂涂影院APP-免费VIP电影观看「安卓APP」
  2. Vue项目——去哪网(首页部分)
  3. 计算机网络 - TCP/IP模型
  4. JavaScript - jQuery注意点
  5. PAT T1015 Letter-moving Gam
  6. navicat12破解详细教程
  7. winform和wpf里必知的多线程知识
  8. intelliJ IDEA 全屏键盘手
  9. 浏览器输入URL后HTTP请求返回的完整过程
  10. Spring Schedule 实现定时任务