题意很简单,所有人编号为1题意很简单,所有人编号为 1题意很简单,所有人编号为1~n围成一圈,每个球只能往左或往右传n围成一圈,每个球只能往左或往右传n围成一圈,每个球只能往左或往右传
球初始在1的位置,问你经过m次传递传回来的方案数球初始在1的位置,问你经过m次传递传回来的方案数球初始在1的位置,问你经过m次传递传回来的方案数
一.递归(60分)一.递归(60分)一.递归(60分)
我们可以递归球的位置,当球在第1个位置且递归层数即传递次数为m时,ans加1我们可以递归球的位置,当球在第1个位置且递归层数即传递次数为m时,ans加1我们可以递归球的位置,当球在第1个位置且递归层数即传递次数为m时,ans加1
代码如下代码如下代码如下
我们来评估一下这个dfs的时间复杂度我们来评估一下这个dfs的时间复杂度我们来评估一下这个dfs的时间复杂度
不难看出每次递归都会产生两种情况并递归,所以时间复杂度为O(2m)不难看出每次递归都会产生两种情况并递归,所以时间复杂度为O(2^m)不难看出每次递归都会产生两种情况并递归,所以时间复杂度为O(2m)
对于m≤30的数据,肯定会超时,最终得到60分对于m\le30的数据,肯定会超时,最终得到60分对于m≤30的数据,肯定会超时,最终得到60分
二.递推(动态规划)(100分)二.递推(动态规划)(100分)二.递推(动态规划)(100分)
主播至今没分清递推和动态规划的区别主播至今没分清递推和动态规划的区别主播至今没分清递推和动态规划的区别
我们会想到每一个在第i步球在第j个位置的情况,总是会由第i−1步的球在第j+1和j−1的情况变过来的我们会想到每一个在第i步球在第j个位置的情况,总是会由第i-1步的球在第j+1和j-1的情况变过来的我们会想到每一个在第i步球在第j个位置的情况,总是会由第i−1步的球在第j+1和j−1的情况变过来的
那不妨设dp[i][j]为在第i步球在第j位情况的方案数那不妨设dp[i][j]为在第i步球在第j位情况的方案数那不妨设dp[i][j]为在第i步球在第j位情况的方案数
则dp式为dp[i][j]=dp[i−1][j−1]+dp[i−1][j+1]则dp式为dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]则dp式为dp[i][j]=dp[i−1][j−1]+dp[i−1][j+1]
初始状态:很简单因为一开始球必定在1的手上所以dp[0][1]=1初始状态:很简单因为一开始球必定在1的手上所以dp[0][1]=1初始状态:很简单因为一开始球必定在1的手上所以dp[0][1]=1
注意转移时特判1和n注意转移时特判1和n注意转移时特判1和n
1.小练习(补全下列代码)
①
A.j==1A.j==1A.j==1
B.j==nB.j==nB.j==n
C.i==nC.i==nC.i==n
D.i==1D.i==1D.i==1
②
A.dp[i−1][1]A.dp[i-1][1]A.dp[i−1][1]
B.dp[i−1][j−1]B.dp[i-1][j-1]B.dp[i−1][j−1]
C.dp[i−1][n]C.dp[i-1][n]C.dp[i−1][n]
D.dp[i−1][j+1]D.dp[i-1][j+1]D.dp[i−1][j+1]
③
A.j==1A.j==1A.j==1
B.j==nB.j==nB.j==n
C.i==nC.i==nC.i==n
D.i==1D.i==1D.i==1
④
A.dp[i−1][1]A.dp[i-1][1]A.dp[i−1][1]
B.dp[i−1][j−1]B.dp[i-1][j-1]B.dp[i−1][j−1]
C.dp[i−1][n]C.dp[i-1][n]C.dp[i−1][n]
D.dp[i−1][j+1]D.dp[i-1][j+1]D.dp[i−1][j+1]
⑤
A.dp[m][n]A.dp[m][n]A.dp[m][n]
B.dp[1][n]B.dp[1][n]B.dp[1][n]
C.dp[1][m]C.dp[1][m]C.dp[1][m]
D.dp[m][1]D.dp[m][1]D.dp[m][1]
2.正解
时间复杂度O(nm)可过时间复杂度O(nm)可过时间复杂度O(nm)可过
参考答案:BAACD参考答案:BAACD参考答案:BAACD
制作不易求点赞制作不易求点赞制作不易求点赞