poj 1088

来源:互联网 发布:ubuntu软件在哪下 编辑:程序博客网 时间:2024/06/02 01:28

题目概述

给定一个R行C列的矩阵,矩阵中每个位置均有一数,求在矩阵中任意位置开始,每次仅移动到周围相邻四格中数字小于当前位置的路径的最大长度

时限

1000ms/3000ms

输入

第一行两个正整数R,C,其后R行,每行C个正整数,为矩阵中数字,输入到EOF为止

限制

1<=R,C<=100;0<=矩阵中的数<=10000

输出

每行一个数,所求最大路径长度

样例输入

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

样例输出

25

讨论

深搜+记忆化,应该算是这部分最老套的题目了,对每个点进行深搜,若深搜过则直接返回结果,否则就继续深搜,然后把结果存下来,所以最后只是对矩阵中每个点都深搜过一遍而已

题解状态

252K,16MS,C++,1001B

题解代码

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define INF 0x3f3f3f3f  #define MAXN 103#define memset0(a) memset(a,0,sizeof(a))#define EPS 1e-6int R, C;//矩阵行数 列数int mat[MAXN][MAXN], dp[MAXN][MAXN];//matrix 矩阵原始数据 dp 名字是随手起的 记录深搜结果的矩阵int dc[4] = { -1,0,1,0 }, dr[4] = { 0,1,0,-1 };//方向矩阵 d是directionint dfs(int r, int c){    if (dp[r][c] != -1)//因为题目中说矩阵中最小的数是0 因而不能以0作为未深搜的标志 那就用-1        return dp[r][c];    int most = 0;    for (int p = 0; p < 4; p++)        if (r + dr[p] >= 0 && r + dr[p] < R&&c + dc[p] >= 0 && c + dc[p] < C&&mat[r + dr[p]][c + dc[p]] < mat[r][c])//不能超出矩阵 而且要严格减小            most = max(most, 1 + dfs(r + dr[p], c + dc[p]));    dp[r][c] = most;//记录结果    return most;}int fun(){    for (int p = 0; p < R; p++)        for (int i = 0; i < C; i++) {            scanf("%d", &mat[p][i]);//input            dp[p][i] = -1;//顺手初始化        }    int most = 0;    for (int p = 0; p < R; p++)        for (int i = 0; i < C; i++)            most = max(most, dfs(p, i));    return most + 1;//由于深搜的点自身没有算进去 因而要额外+1}int main(void){    //freopen("vs_cin.txt", "r", stdin);    //freopen("vs_cout.txt", "w", stdout);    while (~scanf("%d%d", &R, &C)) {//input        printf("%d\n", fun());//output    }}

EOF

0 0
原创粉丝点击