您的位置:首页 > 其它

uvaoj 10285 - Longest Run on a Snowboard 记忆化搜索

2014-11-17 14:14 381 查看
10285 - Longest
Run on a Snowboard
滑雪的时候要从高出滑到地处,现给定一个r*c的矩阵,只有当周围的四个格子的高度低于这个格子的时候,才可以滑到这个格子,现在让求出能滑的最长距离.
使用记忆化搜索来做,dp[i][j]表示从位置i,j开始上升的最大长度(其实和下降的是一样的),在高度数组周围赋值为-1,表示不能上升到边界外,则dp[i][j]=四周的最大距离+1,使用递归来写,当周围不能再上升的时候,这个位置就是1,然后把这个值记下来,下次访问到的时候就不用在计算了.
代码如下:
/*************************************************************************
> File Name: 10285.cpp
> Author: gwq
> Mail: 457781132@qq.com
> Created Time: 2014年11月17日 星期一 09时15分49秒
************************************************************************/

#include <cmath>
#include <ctime>
#include <cctype>
#include <climits>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <iostream>
#include <algorithm>

#define INF (INT_MAX / 10)
#define clr(arr, val) memset(arr, val, sizeof(arr))
#define pb push_back
#define sz(a) ((int)(a).size())

using namespace std;
typedef set<int> si;
typedef vector<int> vi;
typedef map<int, int> mii;
typedef long long ll;

#define N 110

int h

, dp

, r, c;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
char str
;

//记忆化搜索,计算以sx,sy为起点的最长上升序列长度
int dfs(int sx, int sy)
{
if (dp[sx][sy] > 0) {
return dp[sx][sy];
} else {
int ret = 1;
for (int i = 0; i < 4; ++i) {
int nx = sx + dx[i];
int ny = sy + dy[i];
if (h[nx][ny] > h[sx][sy]) {
ret = max(ret, dfs(nx, ny) + 1);
}
}
dp[sx][sy] = ret;
return ret;
}
}

int solve(void)
{
int ans = 0;
clr(dp, 0);
for (int i = 1; i <= r; ++i) {
for (int j = 1; j <= c; ++j) {
ans = max(ans, dfs(i, j));
}
}

return ans;
}

int main(int argc, char *argv[])
{
int t;
scanf("%d", &t);
while (t--) {
scanf("%s%d%d", str, &r, &c);
clr(h, -1);
for (int i = 1; i <= r; ++i) {
for (int j = 1; j <= c; ++j) {
scanf("%d", &h[i][j]);
}
}
printf("%s: %d\n", str, solve());
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: