暴力递归转动态规划详解

以两个题目来说明,并带你掌握这种转化,不用什么动态规划的方程什么的,你只需要根据题意写出暴力递归就可以了。

第一题:

一排有N个位置,一个机器人在最开始停留在P位置上,如果P==0,下一分钟机器人一定向右移动到1位置,如果P=N-1,下一分钟机器人一定向左移动到N-2位置。如果P在0到N-1之间,下一分钟机器人一定会向左或向右移动,求K分钟时候,机器人到达T位置有多少种走法。

思路:这里我们先用递归求解,然后再阐释暴力递归转动态规划的做法。

递归:在K分钟是T位置上只能从K-1分钟的T-1位置和K-1分钟的T+1位置上来,那么K分钟T位置上走法也就是他们二者之和了。然后在设置相应的边界就可以了。

public static int f1(int N,int P,int K,int T){
        if (N < 2 || P < 0 || K < 1 || T < 0 || P >= N || T >= N) {
            return 0;
        }
        if (K == 1) {
            return T==P?1:0;
        }
        if (T == 0) {
            return  f1(N,P,K-1,1);
        }
        if (T == N - 1) {
            return f1(N,P,K-1,T-1);
        }
        return f1(N,P,K-1,T-1)+f1(N,P,K-1,T+1);
    }

暴力递归转动态规划:由递归式可知N、P传进来就没有变过,所以这个dp由K、T控制,但是T的取值范围是N,所有组成一个K*N的二维数组。然后根据递归式转换数组。


public static int f2(int N, int P, int K, int T) {
        if (N < 2 || P < 0 || K < 1 || T < 0 || P >= N || T >= N) {
            return 0;
        }
        int[][] dp = new int[K][N]
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值