原题链接:https://leetcode.cn/problems/count-special-integers/
同样是数位dp的题目
func countSpecialNumbers(n int) int {
s := strconv.Itoa(n)
m := len(s)
memo := make([][1 << 10]int, m)
for i := range memo {
for j := range memo[i] {
memo[i][j] = -1
}
}
var dfs func(i, mask int, isLimit, isNumber bool) int
dfs = func(i, mask int, isLimit, isNumber bool) int {
if i == m {
if isNumber{
return 1
}
return 0
}
if isNumber && !isLimit && memo[i][mask] != -1 {
return memo[i][mask]
}
res := 0
if !isNumber {
res += dfs(i+1, mask, false, false)
}
low := 1
if isNumber {
low = 0
}
high := 9
if isLimit {
high = int(s[i] - '0')
}
for j := low; j <= high; j ++ {
if (mask >> j) & 1 == 0 {
res+= dfs(i+1, mask | (1 << j), isLimit && (j == high), true)
}
}
if isNumber && !isLimit {
memo[i][mask] = res
}
return res
}
return dfs(0, 0, true, false)
}