func numRollsToTarget(n int, k int, target int) int {
f := make([][]int, n + 1)
for i := range f {
f[i] = make([]int, target + 1)
}
mod := 1000000000 + 7
f[0][0] = 1
for i := 1; i <= n; i ++ {
for j := 0; j <= target; j ++ {
for m := 1; m <= j && m <= k; m ++ {
f[i][j] = (f[i][j] + f[i - 1][j - m]) % mod
}
}
}
return f[n][target]
}
仔细思考了一下,我们可以在计算当前行之前将数据清零,以此来实现空间优化:
func numRollsToTarget(n int, k int, target int) int {
mod := 1000000000 + 7
dpPrev := make([]int, target+1)
dpCurr := make([]int, target+1)
dpPrev[0] = 1
for i := 1; i <= n; i++ {
// 清零
for j := 0; j <= target; j++ {
dpCurr[j] = 0
}
for j := 1; j <= target; j++ {
for m := 1; m <= k && m <= j; m++ {
dpCurr[j] = (dpCurr[j] + dpPrev[j-m]) % mod
}
}
dpPrev, dpCurr = dpCurr, dpPrev
}
return dpPrev[target]
}