博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记忆化搜索 || POJ 1088 滑雪
阅读量:5124 次
发布时间:2019-06-13

本文共 1204 字,大约阅读时间需要 4 分钟。

从任意一点可以往上下左右比它小的数那里走,问最远长度是多少
*解法:每一点dfs搜索一遍
记忆化搜索:
递归:求解的方法都是相同的(距离是周围的点最大值加一),假设已知周围点的距离则dd[i] = dfs(xx, yy) + 1; 
每一次递归将当前状态入栈,递归到头的时候返回时取出栈中状态
#include 
#include
using namespace std;int R, C;int a[105][105], ans[105][105];int dx[] = {
1, -1, 0, 0};int dy[] = {
0, 0, 1, -1};int vis[105][105], dis[105][105];int dfs(int x, int y){ int dd[] = {
0, 0, 0, 0}; if(vis[x][y]) return dis[x][y];//没加这句T了 for(int i = 0; i < 4; i++) { int xx = x + dx[i], yy = y + dy[i]; if(xx >= 0 && xx < R && yy >= 0 && yy < C && a[xx][yy] < a[x][y]) { dd[i] = dfs(xx, yy) + 1; } } int res = 0; for(int i = 0; i < 4; i++) res = max(res, dd[i]); vis[x][y] = 1; dis[x][y] = res; return res;}int main(){ int t = 0; scanf("%d %d", &R, &C); for(int i = 0; i < R; i++) for(int j = 0; j < C; j++) scanf("%d", &a[i][j]); for(int i = 0; i < R; i++) { for(int j = 0; j < C; j++) { ans[i][j] = dfs(i, j); t = max(t, ans[i][j]); } } printf("%d\n", t + 1); return 0;}

 

转载于:https://www.cnblogs.com/pinkglightning/p/8407157.html

你可能感兴趣的文章
C#数组的合并拆分
查看>>
[转帖]什么是α射线、β射线、γ射线
查看>>
SQL Server执行计划那些事儿(3)——书签查找
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
ubuntu下sogou突然不能用
查看>>
Linux 普通用户拿到root权限及使用szrz命令上传下载文件
查看>>
联合体union
查看>>
人物角色群体攻击判定(一)
查看>>
JavaWeb学习过程 之c3p0的使用
查看>>
MySql Delimiter
查看>>
一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...
查看>>
使用客户端对象模型读取SharePoint列表数据
查看>>
POJ 1328 Radar Installation 贪心
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
django的url控制系统
查看>>
poj 1753 Flip Game
查看>>
动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )
查看>>
网站公共部分的复用
查看>>
mysql 常用命令(一)
查看>>