您的位置:首页 > 其它

POJ 1088 滑雪 (记忆化搜索)

2016-04-20 11:10 435 查看
题目链接:http://poj.org/problem?id=1088

题意很好懂,就是让你求一个最长下降路线的长度。

dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j], dp[i][j + 1], dp[i + 1][j]) + 1。

已知最低点的答案 慢慢倒推到高点的答案。(还是对记忆化搜不熟练啊)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 105;
int dp[MAXN][MAXN] , r , c , h[MAXN][MAXN] , cont;
int tx[] = {-1 , 0 , 1 , 0} , ty[] = {0 , -1 , 0 , 1};

int dfs(int x , int y) {
if(dp[x][y])
return dp[x][y];
for(int i = 0 ; i < 4 ; i++) {
int xx = x + tx[i] , yy = y + ty[i];
if(xx < 1 || yy < 1 || xx > r || yy > c || h[xx][yy] >= h[x][y]) {
continue;
}
dp[x][y] = max(dfs(xx , yy) , dp[x][y]);
}
return (++dp[x][y]);
}

int main()
{
while(~scanf("%d %d" , &r , &c)) {
cont = 0;
memset(dp , 0 , sizeof(dp));
for(int i = 1 ; i <= r ; i++) {
for(int j = 1 ; j <= c ; j++) {
scanf("%d" , &h[i][j]);
}
}
for(int i = 1 ; i <= r ; i++) {
for(int j = 1 ; j <= c ; j++) {
cont = max(cont , dfs(i , j));
}
}
printf("%d\n" , cont);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: