51nod 1043 幸运号码(数位DP)

Posted leonard-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1043 幸运号码(数位DP)相关的知识,希望对你有一定的参考价值。

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043

题目:

1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码。
例如:99、1230、123312是幸运号码。
给出一个N,求长度为2N的幸运号码的数量。由于数量很大,输出数量 Mod 10^9 + 7的结果即可。
Input
输入N(1<= N <= 1000)
 
Output
输出幸运号码的数量 Mod 10^9 + 7
 
Input示例
1
Output示例
9
题解:dp[i][j]表示长度为i,各位数之和为j的号码的数量(包括前导0),状态转移方程:dp[i][j]=dp[i][j]+dp[i-1][j-k]。最后计算的时候前半部分需要减掉前导0,后半部分不用,然后从0到9*n的对应值相乘求和。
 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 const int N=1234;
 6 const LL mod=1e9+7;
 7 LL dp[N][9*N];
 8 
 9 int main(){
10     int n;
11     LL ans=0;
12     cin>>n;
13     dp[0][0]=1;
14     for(int i=1;i<=n;i++)
15     for(int j=0;j<=9*n;j++)
16     for(int k=0;k<=9;k++)
17     if(j>=k) dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
18     else break;
19 
20     for(int i=0;i<=9*n;i++){
21         ans=(ans+(dp[n][i]-dp[n-1][i])*dp[n][i]%mod)%mod;
22     }
23     cout<<ans<<endl;
24     return 0;
25 }

 

 
 
 

以上是关于51nod 1043 幸运号码(数位DP)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1043 幸运号码(数位dp)

51nod1043 幸运号码(数位dp)

AC日记——幸运号码 51nod 1043

1043 幸运号码 数位DP

51Nod_1043_幸运号码

51nod1043(数位dp)