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 }

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

时间: 2024-10-24 22:08:55

51nod 1043 幸运号码(数位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 幸运号码(数位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时,无非

1043 幸运号码

1043 幸运号码 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 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.dp[i][j

51NOD 1623 完美消除 数位DP

题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的数减x:否则就是不合法的,不能进行操作.对一个数操作最少的次数使得这个数变成0,这个操作次数称为该数的最小操作数.如:1232的最小操作数为3,一个合法解是[2,2,1],[1,3,2],[4,4,1]. 求L~R中最小操作数为k的数的个数. 例如:132,需要操作3次才能变为0.而131131 =

51nod 1232 完美数 数位dp

1232 完美数 题目来源: 胡仁东 基准时间限制:2 秒 空间限制:131072 KB 如果一个数能够被组成它的各个非0数字整除,则称它是完美数.例如:1-9都是完美数,10,11,12,101都是完美数,但是13就不是完美数(因为13不能被数字3整除). 现在给定正整数x,y,求x和y之间(包含x和y的闭区间)共有多少完美数. 题目作者为: Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行2个数,X, Y中间用空

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

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

51nod 1009 数位dp入门

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 数字1的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出