COJ 1196 Staginner 去爬山

动态规划爬楼问题
本文介绍了一种使用动态规划解决特殊爬楼问题的方法,该问题允许向上或向下移动,并通过一个示例C++程序展示了如何实现这一算法。

……;

给出可以走的位置,问最多能爬多少层,使用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];
}

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/04/23/2466614.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值