51nod 1043 幸运号码(dp)

来源:互联网 发布:bp算法 链式求导 编辑:程序博客网 时间:2024/05/22 02:25

看完题就想到了数位dp,但怎么处理却是一脸懵逼,那就去看题解咯这里写图片描述
dp[i][j]表示i位数字的和为j的组合数
dp[i][j] = ∑dp[i-1][j-k],(k=0,1…9)。(包含前导0)
dp[i][j]-dp[i-1][j]就是dp[i][j]去掉前导0的组合数

#include <iostream>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;const int MAXN = 1010;ll N;ll dp[MAXN][MAXN*9];const int mod = 1e9+7;int main(){    cin.sync_with_stdio(false);    cin.tie(false);    cin >> N;    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 <= 9*N; ++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;            }        }    }    ll sum = 0;    for(int i = 0; i <= 9*N; ++i)    {        sum = (sum+dp[N][i]*(dp[N][i]-dp[N-1][i]))%mod;    }    cout << sum <<endl;    return 0;}
原创粉丝点击