数学

public int countNumbersWithUniqueDigits(int n) {
    if (n == 0) return 1;
    int[] dp = new int[n + 1];
    dp[0] = 1;
    dp[1] = 10;
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + (dp[i - 1] - dp[i - 2]) * (10 - (i - 1));
    }
    return dp[n];
}
public int countNumbersWithUniqueDigits(int n) {
    if (n == 0) return 1;
    int ans = 10;
    for (int i = 2, last = 9; i <= n; i++) {
        int cur = last * (10 - i + 1);
        ans += cur;
        last = cur;
    }
    return ans;
}

  • F(0) = 0 * A[0] + 1 * A[1] + 2 * A[2] +...+ i * A[i] +...+ (n - 1) * A[n - 1]

  • F(1) = 0 * A[n - 1] + 1 * A[0] + 2 * A[1] +...+ (i + 1) * A[i] +...+ (n - 1) * A[n - 2]

错位相减,拿F(1)中的第二位减去F(0)中的第一位

F(1)-F(0)=0 * A[n - 1] + (1 * A[0]-0 * A[0]) + (2 * A[1]-1 * A[1]) +...+ ((i + 1) * A[i]-i * A[i]) +...+ ((n - 1) * A[n - 2] -(n - 2) * A[n - 2])-(n - 1) * A[n - 1]

整理得到

F(1)-F(0)= A[0]+A[1]+...+A[i]+...A[n-2]-(n-1)A[n-1]

多配一个A[n-1]

F(1)-F(0)= A[0]+A[1]+...+A[i]+...A[n-2]+A[n-1]- n* A[n-1]

F(1)-F(0)= sum{A[0]:A[n-1]}- n* A[n-1]

推广到一般情况,A[n-1]换成A[n-k]

F(k+1)-F(k)= sum{A[0]:A[n-1]}-n*A[n-k]

方法1:模拟

方法1:海伦公式+暴力

方法2:鞋带公式

方法3:两边a,b,这两边夹角C

lambda写法

  • 动态规划优化

Last updated