51nod1043 幸运号码(数位dp)

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]  表示表示长度为2*i 其中一半的和为j的数量,当长度为i-1的已知时,计算长度为i时,无非就是在长度i-1上加0-9   所以dp[i][j] = ∑dp[i-1][j-k] (0 ≤ k ≤ 9)  计算长度为n时去掉前导0 dp[n][j] - dp[n-1][j]

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N = 1010;
 5 const int mod = 1e9+7;
 6 ll dp[N][N*10];
 7 int main() {
 8     dp[0][0] = 1;
 9     int n;cin >> n;
10     for(int i = 1; i <= n; i ++) {
11         for(int j = 0; j <= i*9; j ++) {
12             for(int k = 0; k <= 9; k ++) {
13                 if(j>=k) dp[i][j] = (dp[i][j]+dp[i-1][j-k])%mod;
14             }
15         }
16     }
17     ll ans = 0;
18     for(int i = 0; i <= 9*n; i ++) {
19         ans = (ans+(dp[n][i]-dp[n-1][i])*dp[n][i])%mod;
20     }
21     cout << ans << endl;
22     return 0;
23 }

原文地址:https://www.cnblogs.com/xingkongyihao/p/9568444.html

时间: 2024-10-08 07:53:58

51nod1043 幸运号码(数位dp)的相关文章

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

题目链接:51nod 1043 幸运号码 题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况) dp[i][j] = dp[i-1][j-k] i & 1 :这里用滚动数组节省内存 非0开头的情况 * 0开头的情况:(dp[n&1][i]-dp[(n-1)&1][i]) *dp[n&1][i],最后将其累加即为结果. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cst

1043 幸运号码 数位DP

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 设dp[i][j]表示前i位数中,i位数的和为j时的所有情况. 转移的时候和普通的数位dp是一样转移的,但是如果你压缩了空间的话,就是用滚动数组的话,记录情况数就要多开一个变量来保存, 然后看看怎么排除前导0的情况. 如果产生的和值是j,然后前i - 1位产生的和值也是j,那么第i为就是前导0了.需要排除. 然后前n部分的和值的所有情况(需要排除前导0) * 后n

[51nod1043]幸运号码

题意:1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码. 例如:99.1230.123312是幸运号码. 给出一个N,求长度为2N的幸运号码的数量.由于数量很大,输出数量 Mod 10^9 + 7的结果即可. 解题关键: 动态规划,dp[i][j]表示i个数和为j的总数(这里包括开头为0的情况) $dp[i][j] = \sum\limits_{k = 0}^9 {dp[i - 1][j - k]} $最后,我们只需要用去掉0打头的情况*没有去掉0打头的情况累加并

xbz分组题B 吉利数字 数位dp入门

B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第一行为样例个数N.接下来N行,每一行代表一个输入样例,每个输入样例有2个数,分别代表某个区间的起点a和终点b.注意所求区间为[a,b],1<=a<=b<=10^9 [输出]N行.对于第x个输入样例,在第x行输入该样例所对应的结果. [输入样例]21 101 20 [输出样例]01 [Hint

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

51nod1043(数位dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 题意:中文题诶- 思路:数位dp 我们用dp[i][j]来存储长度为2*i且一半和为j的所有情况(包括前导0的情况),为了方便我们现在只讨论其一半的和的情况,因为如果包括前导0的话其两边的情况是一样的: 我们假设再长度为i-1的数字最前面加1位数字k,0<=k<=9(这位数字加在哪里并不影响答案,因为我们在计算i-1长度的时候已经计算了所有组合情况,

【ACM】不要62 (数位DP)

题目:http://acm.acmcoder.com/showproblem.php?pid=2089 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务

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

幸运号码 思路: 传说中的数位dp: 不难发现,n(n<1000) ,那么,n个数的最大和为9*1000=9000: 对于9000*1000的时间范围,我们可以用dp来解决: dp[i][j],表示第i为数总和为j的号码的个数: 每个dp[i][j]都是dp[i-1][j-v](0<=v<=9) 的总和: 然后按照左边的n和右边的n,分为有前导0,和没有前导0进行dp: 然后输出排列的答案即可: dp[1000][9000]*2会爆空间,所以我选择压掉i维: 来,上代码: #includ

[ACM] hdu 2089 不要62(数位Dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19043    Accepted Submission(s): 6442 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就