从1开始,每次增加1,2或3,有多少种方法可以加到9?

这个题是《计算之魂》里边的一个问答题,完全不会呀,问一下AI怎么解决:

有几种方法可以加到9的问题可以使用递归或动态规划来解决。以下是一种使用动态规划的方法:

我们定义一个数组 d p [ i ] dp[i] dp[i],其中 d p [ i ] dp[i] dp[i] 表示从 1 开始每次增加 1,2 或 3 的方式到达数字 i i i 的总数。

初始化 d p dp dp 数组为 d p [ 0 ] = 1 dp[0]=1 dp[0]=1,因为不需要任何操作就可以从数字 1 到达数字 1。

然后对于数字 i i i,我们可以从数字 i − 1 i-1 i1 i − 2 i-2 i2 i − 3 i-3 i3 转移而来,因此状态转移方程为:

d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] dp[i] = dp[i-1] + dp[i-2] + dp[i-3] dp[i]=dp[i1]+dp[i2]+dp[i3]

最终答案为 d p [ 9 ] dp[9] dp[9] 最终答案为 d p [ 8 ] dp[8] dp[8],即从数字 1 开始每次增加 1,2 或 3 的方式到达数字 9 的总数。根据上述方程,可以得到以下动态规划代码实现:

int countWays(int n) {
    int dp[n+1];
    dp[0] = 1;
    for (int i = 1; i <= n; i++) {
        if (i == 1)
            dp[i] = dp[i-1];
        else if (i == 2)
            dp[i] = dp[i-1] + dp[i-2];
        else
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
    }
    return dp[n];
}

将输入参数设置为 8,调用函数 countWays(8),即可得到从数字 1 开始每次增加 1,2 或 3 的方式到达数字 8 的总数。

状态转移方程

当我们要求从 1 开始每次增加 1,2 或 3 的方式到达数字 i i i 的总数时,可以考虑从前一个状态 i − 1 i-1 i1 i − 2 i-2 i2 i − 3 i-3 i3 转移而来。

具体而言,如果从数字 i − 1 i-1 i1 转移而来,那么只需要在前一步加上 1;如果从数字 i − 2 i-2 i2 转移而来,那么只需要在前一步加上 2;如果从数字 i − 3 i-3 i3 转移而来,那么只需要在前一步加上 3。

因此,总的方案数等于从数字 i − 1 i-1 i1 到达数字 i i i 的方案数、从数字 i − 2 i-2 i2 到达数字 i i i 的方案数和从数字 i − 3 i-3 i3 到达数字 i i i 的方案数之和。即:

d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] dp[i] = dp[i-1] + dp[i-2] + dp[i-3] dp[i]=dp[i1]+dp[i2]+dp[i3]

其中 d p [ i ] dp[i] dp[i] 表示从 1 开始每次增加 1,2 或 3 的方式到达数字 i i i 的总数。

当调用函数 countWays(8) 时,会执行以下过程:

  1. 在函数内部,定义了一个大小为 10 10 10 的数组 d p dp dp,并将其初始化为 d p [ 0 ] = 1 dp[0]=1 dp[0]=1
  2. 使用 for 循环依次计算数组中每个元素的值。当 i = 1 i=1 i=1 时,只有一种方案,即 d p [ 1 ] = d p [ 0 ] dp[1]=dp[0] dp[1]=dp[0];当 i = 2 i=2 i=2 时,有两种方案: d p [ 2 ] = d p [ 1 ] + d p [ 0 ] dp[2]=dp[1]+dp[0] dp[2]=dp[1]+dp[0];当 i ≥ 3 i\geq3 i3 时,有三种方案: d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] dp[i]=dp[i-1]+dp[i-2]+dp[i-3] dp[i]=dp[i1]+dp[i2]+dp[i3]
  3. 最终返回 d p [ 8 ] dp[8] dp[8] 的值,即从数字 1 开始每次增加 1,2 或 3 的方式到达数字 9 的总数。

具体地,循环执行过程如下:

  1. i = 1 i=1 i=1 时, d p [ 1 ] = d p [ 0 ] = 1 dp[1]=dp[0]=1 dp[1]=dp[0]=1
  2. i = 2 i=2 i=2 时, d p [ 2 ] = d p [ 1 ] + d p [ 0 ] = 1 + 1 = 2 dp[2]=dp[1]+dp[0]=1+1=2 dp[2]=dp[1]+dp[0]=1+1=2
  3. i = 3 i=3 i=3 时, d p [ 3 ] = d p [ 2 ] + d p [ 1 ] + d p [ 0 ] = 2 + 1 + 1 = 4 dp[3]=dp[2]+dp[1]+dp[0]=2+1+1=4 dp[3]=dp[2]+dp[1]+dp[0]=2+1+1=4
  4. i = 4 i=4 i=4 时, d p [ 4 ] = d p [ 3 ] + d p [ 2 ] + d p [ 1 ] = 4 + 2 + 1 = 7 dp[4]=dp[3]+dp[2]+dp[1]=4+2+1=7 dp[4]=dp[3]+dp[2]+dp[1]=4+2+1=7
  5. i = 5 i=5 i=5 时, d p [ 5 ] = d p [ 4 ] + d p [ 3 ] + d p [ 2 ] = 7 + 4 + 2 = 13 dp[5]=dp[4]+dp[3]+dp[2]=7+4+2=13 dp[5]=dp[4]+dp[3]+dp[2]=7+4+2=13
  6. i = 6 i=6 i=6 时, d p [ 6 ] = d p [ 5 ] + d p [ 4 ] + d p [ 3 ] = 13 + 7 + 4 = 24 dp[6]=dp[5]+dp[4]+dp[3]=13+7+4=24 dp[6]=dp[5]+dp[4]+dp[3]=13+7+4=24
  7. i = 7 i=7 i=7 时, d p [ 7 ] = d p [ 6 ] + d p [ 5 ] + d p [ 4 ] = 24 + 13 + 7 = 44 dp[7]=dp[6]+dp[5]+dp[4]=24+13+7=44 dp[7]=dp[6]+dp[5]+dp[4]=24+13+7=44
  8. i = 8 i=8 i=8 时, d p [ 8 ] = d p [ 7 ] + d p [ 6 ] + d p [ 5 ] = 44 + 24 + 13 = 81 dp[8]=dp[7]+dp[6]+dp[5]=44+24+13=\boxed{81} dp[8]=dp[7]+dp[6]+dp[5]=44+24+13=81

因此,从数字 1 开始每次增加 1,2 或 3 的方式到达数字 9 的总数为 81种。

AI 永远的神!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值