UVA 10285 Longest Run on a Snowboard

UVA_10285

    这个题目可以用记忆化搜索实现,f[i][j]记录的是周边四个点可以深搜到的最大值加1。

    枚举一遍i、j并进行记忆化搜索即可。

#include<stdio.h>
#include<string.h>
#define MAXD 110
char b[110];
int N, M, a[MAXD][MAXD], f[MAXD][MAXD], max;
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
void init()
{
int i, j;
scanf("%s%d%d", b, &N, &M);
for(i = 0; i < N; i ++)
for(j = 0; j < M; j ++)
scanf("%d", &a[i][j]);
}
int dfs(int x, int y)
{
int i, j, newx, newy, m, temp;
if(f[x][y] != -1)
return f[x][y];
m = 1;
for(i = 0; i < 4; i ++)
{
newx = x + dx[i];
newy = y + dy[i];
if(newx >= 0 && newx < N && newy >= 0 && newy < M && a[newx][newy] > a[x][y])
{
temp = dfs(newx, newy);
if(temp + 1 > m)
m = temp + 1;
}
}
return f[x][y] = m;
}
void solve()
{
int i, j, temp;
memset(f, -1, sizeof(f));
max = 1;
for(i = 0; i < N; i ++)
for(j = 0; j < M; j ++)
{
temp = dfs(i, j);
if(temp > max)
max = temp;
}
printf("%s: %d\n", b, max);
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
init();
solve();
}
return 0;
}


你可能感兴趣的:(long)