下定决心,好好过一天 ~
思路:首先数位dp是肯定可以的,只不过状态需要压缩。利用二进制形式进行压缩。
但是这个题没有想象那么复杂。直接递推即可,dp[ i ] 代表 拥有 i 位数的合法的数。
那么就是 9 * 9 * 8 * 7 … 第一位不能选零。其实更像组合数学。
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
int dp[20] = {0};
dp[0] = 1;dp[1] = 10;
for(int i = 2;i <= 10;i++)
{
dp[i] = 9*9;
int m = 8;
for(int j = 3;j <= i;j++)
{
dp[i] *= m;
m--;
}
}
if(n > 10) n = 10;
int sum = 0;
for(int i = 1;i <= n;i++)
{
sum += dp[i];
}
if(sum == 0) sum = 1;
// cout << sum << endl;
return sum;
}
};