COJ 1196 Staginner 去爬山

……;

给出可以走的位置,问最多能爬多少层,使用dp,这道题有点不同的是还可以往下走,而常见的大都是递推,需要多加一个条件,谢谢Staginner大牛的指点!

dfs可能会超时(深度太大)?

为什么使用C++提交而不是C?在COJ上遭遇过使用C比C++耗时超出3s的经历(时限是5s)。

# include <stdio.h>

# include <string.h>



# define N 105

 

char map[N][N];

int n, m, f[N][N];

 

int dp(int i, int j);

 

int main()

{

    int i, j, h;

     

    while (~scanf("%d%d", &n, &m))

    {

        for (i = n; i >= 1; --i)

        for (j = 1; j <= m; ++j)

            scanf("%d", &map[i][j]);

         

        h = 0;

        memset(f, -1, sizeof(f));

        for (j = 1; j <= m; ++j)

            if (map[1][j] && h<dp(1,j))

                h = f[1][j];

 

        printf("%d\n", h);

    }

     

    return 0;

}

 

int dp(int i, int j)

{

    if (f[i][j] >= 0) return f[i][j];

    if (map[i][j]) f[i][j] = 1;

    else return f[i][j] = 0;

    if (i+1<=n && map[i+1][j] && f[i][j]<dp(i+1,j)+1) f[i][j] = f[i+1][j]+1;

    if (j+1<=m && map[i][j+1] && f[i][j]<dp(i,j+1)) f[i][j] = f[i][j+1];

    if (j-1>=1 && map[i][j-1] && f[i][j]<dp(i,j-1)) f[i][j] = f[i][j-1];

    if (i-1>=1 && map[i-1][j] && f[i][j]<dp(i-1,j)-1) f[i][j] = f[i-1][j]-1;

    return f[i][j];

}

你可能感兴趣的:(inner)