题目链接
题目大意
有一个长度为
a
r
r
L
e
n
arrLen
arrLen 的数组,开始有一个指针在索引 0 处。
每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。
给你两个整数 s t e p s steps steps 和 a r r L e n arrLen arrLen ,请你计算并返回:在恰好执行 s t e p s steps steps 次操作以后,指针仍然指向索引 0 处的方案数。
由于答案可能会很大,请返回方案数 模 1 0 9 + 7 10^9 + 7 109+7 后的结果。
示例 1
输入:steps = 3, arrLen = 2
输出:4
解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。
向右,向左,不动
不动,向右,向左
向右,不动,向左
不动,不动,不动
提示:
1
≤
s
t
e
p
s
≤
500
1 \leq steps \leq 500
1≤steps≤500
1
≤
a
r
r
L
e
n
≤
1
0
6
1 \leq arrLen \leq 10^6
1≤arrLen≤106
1.确定状态
f
[
i
]
[
j
]
f[i][j]
f[i][j]: 表示走了
i
i
i 步,走到第
j
j
j 个位置的状态。属性表示方案数量。
2.状态转移 每次能向👈👉 或 不动,因此每个位置状态可以由 上一步的👈👉或者不动的那个状态转移过来,即
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
−
1
]
+
f
[
i
−
1
]
[
j
]
+
f
[
i
−
1
]
[
j
+
1
]
f[i][j] = f[i-1][j-1] + f[i-1][j] + f[i-1][j+1]
f[i][j]=f[i−1][j−1]+f[i−1][j]+f[i−1][j+1],注意处理边界问题即可。
const int maxm = 507,mod = 1e9 + 7;
int f[maxm][maxm];
class Solution {
public:
int numWays(int steps, int arrLen) {
memset(f, 0, sizeof f);
int l = min(arrLen-1,steps);
f[0][0] = 1;
for(int i = 1; i <= steps; i++)
{
for(int j = 0; j <= l; j++)
{
f[i][j] = f[i-1][j]%mod;
if(j-1 >= 0) f[i][j] =(f[i][j] + f[i-1][j-1])%mod;
if(j+1 <= l) f[i][j] =(f[i][j] + f[i-1][j+1])%mod;
}
}
return f[steps][0]%mod;
}
};
该博客探讨了一道编程题,涉及动态规划方法来计算在执行一定次数的操作后,数组指针仍然回到初始位置的方案数。题目中指针可以在数组内左右移动或停留,目标是求出所有可能的方案,并对结果取模。博主给出了状态转移方程和代码实现,展示了如何处理边界条件并计算最终答案。
365

被折叠的 条评论
为什么被折叠?



