AT1483题解

· · 题解

这题是一道数位DP。

1. 状态表示: 我们设f[i][j][k]表示所有数位为i位\;\;最高位为j\;出现数字k的次数,(如f[2][1][1]=11,因为10~19间出现了11次1)。(其实这题不用3维,但为了更好享用多倍经验,所以...)

2.状态转移: 先给些柿子

(1)

\sum_{i=0}^{i=9}{f[1][i][i]=1}

(2)

f[i][j][k] += \sum_{j=0}^{j=9}{f[i - 1][j][k]}

(3)

\sum_{j=0}^{j=9} {f[i][j][j] += pow(10,i-1)}
for (int i = 0; i <= 9; i++)//柿子1
    f[1][i][i] = 1; //显然!
for (int i = 2; i <= 9; i++)//枚举当前位数
{
    for (int j = 0; j <= 9; j++)//枚举最高位
    {
      for (int k = 0; k <= 9; k++)
            for (int l = 0; l <= 9; l++)//枚举上1位数的最高位
            f[i][j][k] += f[i - 1][l][k];//柿子2
        f[i][j][j] += pow (10, i -1);//柿子3
    }
}

3.计算答案: 由于f[i][j][k]中的只是一段一段的,所以在计算答案时也要分段求: