记忆化搜索_POJ1088(滑雪)
2016-07-15 16:20
381 查看
题目链接:http://poj.org/problem?id=1088
枚举每一个点 (x, y) ,以该点为起点开始滑,求出最大滑行距离,保留在数组 f[x][y] 中,当再次搜索到该点时直接调用,而不必再次求解。
#include <iostream>
using namespace std;
const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};
int a[110][110], f[110][110];
int n,m;
int Max, ans;
int dfs(int x, int y)
{
int ans = 0;
if (f[x][y] != 0)
return f[x][y];
for (int i=0; i<4; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if (xx < 1 || xx > n || yy < 1 || yy > m || a[xx][yy] >= a[x][y])
continue;
int t = dfs(xx,yy);
ans = max(ans, t);
}
f[x][y] = ans + 1;
return f[x][y];
}
int main()
{
cin>>n>>m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) cin>>a[i][j];
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
ans = dfs(i,j);
Max = max(Max, ans);
}
}
cout<<Max<<endl;
return 0;
}
枚举每一个点 (x, y) ,以该点为起点开始滑,求出最大滑行距离,保留在数组 f[x][y] 中,当再次搜索到该点时直接调用,而不必再次求解。
#include <iostream>
using namespace std;
const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};
int a[110][110], f[110][110];
int n,m;
int Max, ans;
int dfs(int x, int y)
{
int ans = 0;
if (f[x][y] != 0)
return f[x][y];
for (int i=0; i<4; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if (xx < 1 || xx > n || yy < 1 || yy > m || a[xx][yy] >= a[x][y])
continue;
int t = dfs(xx,yy);
ans = max(ans, t);
}
f[x][y] = ans + 1;
return f[x][y];
}
int main()
{
cin>>n>>m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) cin>>a[i][j];
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
ans = dfs(i,j);
Max = max(Max, ans);
}
}
cout<<Max<<endl;
return 0;
}
相关文章推荐
- 获取屏幕高度、宽度
- Spring boot bean加载错误排查
- linux内核分析之rbtree的使用
- jquery 循环获取选中checkBox框的值
- July 15th 模拟赛C T1 游泳池 Solution
- (译)WebRTC实战: STUN, TURN, Signaling
- 图片加载失败处理
- Python读取一个目录下所有目录和文件的方法
- 关于Editext弹出键盘的右下角样式简单使用
- 何为Web App,何为Hybird App
- linux下安PHP开发环境
- Angular2 快速入门 之 环境搭建
- Hbase的table存储详解
- 1249 Problem Q
- online ddl 使用、测试及关键函数栈
- spring 框架的xml文件如何读取properties文件数据
- sphinx,coreseek安装
- [从头读历史] 第305节 星球战争 BC2899 至 BC2800(公元前29世纪)
- 软件设计之业务逻辑层设计
- [置顶] 开端