这个题是《计算之魂》里边的一个问答题,完全不会呀,问一下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 i−1, i − 2 i-2 i−2 或 i − 3 i-3 i−3 转移而来,因此状态转移方程为:
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[i−1]+dp[i−2]+dp[i−3]
最终答案为
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 i−1, i − 2 i-2 i−2 或 i − 3 i-3 i−3 转移而来。
具体而言,如果从数字 i − 1 i-1 i−1 转移而来,那么只需要在前一步加上 1;如果从数字 i − 2 i-2 i−2 转移而来,那么只需要在前一步加上 2;如果从数字 i − 3 i-3 i−3 转移而来,那么只需要在前一步加上 3。
因此,总的方案数等于从数字 i − 1 i-1 i−1 到达数字 i i i 的方案数、从数字 i − 2 i-2 i−2 到达数字 i i i 的方案数和从数字 i − 3 i-3 i−3 到达数字 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[i−1]+dp[i−2]+dp[i−3]
其中 d p [ i ] dp[i] dp[i] 表示从 1 开始每次增加 1,2 或 3 的方式到达数字 i i i 的总数。
当调用函数 countWays(8)
时,会执行以下过程:
- 在函数内部,定义了一个大小为 10 10 10 的数组 d p dp dp,并将其初始化为 d p [ 0 ] = 1 dp[0]=1 dp[0]=1。
- 使用 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 i≥3 时,有三种方案: 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[i−1]+dp[i−2]+dp[i−3]。
- 最终返回 d p [ 8 ] dp[8] dp[8] 的值,即从数字 1 开始每次增加 1,2 或 3 的方式到达数字 9 的总数。
具体地,循环执行过程如下:
- 当 i = 1 i=1 i=1 时, d p [ 1 ] = d p [ 0 ] = 1 dp[1]=dp[0]=1 dp[1]=dp[0]=1。
- 当 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。
- 当 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。
- 当 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。
- 当 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。
- 当 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。
- 当 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。
- 当 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种。