原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043
思路:数位dp,因为N最多1000,所以可以定义dp[i][j]为长度为i和为j的数的数量,然后dp[i][j] = sum{dp[i][j-k],k∈[0,9]}
最后统计的时候就是乘法原理,注意前缀0
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;
int dp[1005][10005];
int main() {
int n;
scanf("%d", &n);
int sum = 0;
dp[0][0] = 1;
for (int i = 0; i <= 9; i++)dp[1][i] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= i * 9; j++) {
for (int k = 0; k <= 9; k++) {
if (k <= j) {
dp[i][j] = (dp[i][j] + dp[i-1][j - k]) % MOD;
}
}
}
}
for (int i = 0; i <= n * 9; i++) {
sum = (sum + 1LL * dp[n][i] * (dp[n][i] - dp[n - 1][i])) % MOD;
}
printf("%d\n", sum);
return 0;
}