码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-28 20:13:33      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:space   include   const   https   std   turn   iostream   .com   line   

题目链接: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)

标签:space   include   const   https   std   turn   iostream   .com   line   

原文地址:https://www.cnblogs.com/Leonard-/p/8485424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!