您的位置:首页 > 其它

poj_1088_滑雪

2012-10-25 17:28 246 查看
经典dp问题/记忆化搜索
状态:rst[x][y] 表示从坐标x,y开始获得的最大长度
状态转移方程:rst[x][y] = max(rst[xi][yi])+1; 其中xi,yi为达到x,y的合法坐标
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define DIR     4
#define MAXROW  101
#define MAXCOL  101

int row, col;
int dir[][2] = {
{1, 0}, {-1, 0}, {0, 1}, {0, -1}
};

int map[MAXROW][MAXCOL], rst[MAXROW][MAXCOL];

int depth_frist_serach(const int &x, const int &y)
{
int ans(0), tx, ty;
for(int i = 0; i < DIR; i ++) {
tx = x+dir[i][0]; ty = y+dir[i][1];
if( tx < 0 || ty < 0 || tx >= row || ty >= col || map[tx][ty] >= map[x][y]) {
continue;
}
rst[tx][ty] = (-1 == rst[tx][ty])? depth_frist_serach(tx, ty) : rst[tx][ty];
ans = max(ans, rst[tx][ty]);
}
return ans+1;
}

int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int ans;
while( ~scanf("%d %d", &row, &col) ) {
for(int i = 0; i < row; i ++) {
for(int j = 0; j < col; j ++) {
scanf("%d", &map[i][j]);
}
}
memset(rst, -1, sizeof(rst)); ans = 0;
for(int i = 0; i < row; i ++) {
for(int j = 0; j < col; j ++) {
rst[i][j] = (-1 == rst[i][j])? depth_frist_serach(i, j) : rst[i][j];
ans = max(ans, rst[i][j]);
}
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: