转载:http://www.cnblogs.com/geloutingyu/p/6329594.html
第一眼看过去,没有什么思路,然后也没想到用数位dp怎么写,看了很久大神的代码,才想明白人家是怎么想的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int MAXN=1010;
ll dp[MAXN][MAXN*9]; //***dp[i][j]从存储长度为2*i一半和为j的情况数
int main(void){
ll ans=0;
int n;
cin >> n;
dp[0][0]=1; //***一开始计算时要把所有前导0都算进去
for(int i=1; i<=n; i++){
for(int j=0; j<=i*9; j++){
for(int k=0; k<=9; k++){
if(j>=k){
dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
}else{
break;
}
}
}
}
for(int i=0; i<=9*n; i++){
ans=(ans+(dp[n][i]-dp[n-1][i])*dp[n][i])%mod;
}
cout << ans << endl;
return 0;
}