class Solution {
public:
int countSpecialNumbers(int n) {
string s = to_string(n);
int m = s.size();
vector<vector<int>> memo(m + 1,vector<int>(1 << 10,-1));
function<int(int,int,bool,bool)> dfs = [&](int i,int mask,bool is_limit,bool is_num)->int{
if(i == m) return is_num;
if(!is_limit && is_num && memo[i][mask] != -1) return memo[i][mask];
int res = 0;
if(!is_num){
res += dfs(i +1,mask,false,false);
}
int up = is_limit?s[i] - '0':9;
for(int d = 1 - is_num;d <= up;d++){
if((mask & (1 <<d)) == 0){
res += dfs(i + 1,mask | (1 << d),is_limit && d == up,true);
}
}
if(!is_limit && is_num) memo[i][mask] = res;
return res;
};
return dfs(0,0,true,false);
}
};
数位dp参考题
最新推荐文章于 2024-04-27 19:42:34 发布