poj_1088_滑雪

经典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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值