递推DP

一、什么是递推DP?

这波啊,这波是这波啊,这波是这波啊,这波是这波啊,这波啊,这波是这波啊这波啊,这波是这波啊,这波是······,这波是递推DP。

二、一些例题

1、(70)爬楼梯

需要 n 阶可到达楼顶,每次可爬 1 或 2 个台阶。求爬到楼顶的方法数。

dp[n] = dp[n-1] + dp[n-2];

2、(935)骑士拨号器

国际象棋中的骑士可以按下图所示进行移动:

 

求可组成的 n 位号码个数 (% 1_000_000_007)。


dp[i] 中保存 n 位号码中末尾位为 i 的个数,相加即代表所有 n 位号码的个数。

用 long 避免溢出。(int 范围 :  -2147483648 ~ 2147483647)

public int knightDialer(int n) {
    int mod = 1_000_000_007;
    long sum = 0;
    long[] dp = new long[10];
    long[] tmp = new long[10];
    Arrays.fill(dp, 1);
    if (n == 1) return 10;
    for (int i = 2; i <= n; i++) {
        tmp[0] = dp[4] + dp[6];
        tmp[1] = dp[6] + dp[8];
        tmp[2] = dp[7] + dp[9];
        tmp[3] = dp[4] + dp[8];
        tmp[4] = dp[3] + dp[9] + dp[0];    //此时可能溢出,故用long
        tmp[6] = dp[1] + dp[7] + dp[0];    //
        tmp[7] = dp[2] + dp[6];
        tmp[8] = dp[1] + dp[3];
        tmp[9] = dp[2] + dp[4];
        for (int j = 0; j < 10; j++) dp[j] = tmp[j] % mod;
    }
    for (long i : dp) sum = (sum + i) % mod;
    return (int) sum;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值