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-1][j-k](k从0到9)。

很好想,i个数组成总和为j的数量就来自于i-1个数 里面能 在最前面加0到9的数字使得加完之后和为j。

这里面包含了0开头的,把0去掉的方法就是dp[i][j]-dp[i-1][j]。

dp[i-1][j]就代表了在i个数中,开头为0的个数,减去就是i个数中开头不为0的个数。

原因很明显,i个数和为j与i-1个数和为j,就差了一个位置为0。而这一个位置因为一开始咱们的想法就是在最前面加的数字,所以这个位置就差在了最前面的位置上

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+;
int dp[][];// dp[i][j] 为i个数 和为j的情况 int main()
{
int n;
scanf("%d",&n);
dp[][] = ;//这里明明是网上题解有错误 他们都写的是dp[0][1] = 1
//明明他们是在凑样例的感觉 应该是0个数 凑成0的情况是1
for(int i=;i<=;i++)
dp[][i] = ;
for(int i=;i<=n;i++)
{
for(int j=;j<=*i;j++)
{
int sum = ;
for(int k=;k<=;k++)
{
if(j >=k)
sum = (sum + dp[i-][j-k])%mod;
else
break;
}
dp[i][j] = sum;
}
}
ll ans = ;
for(int i=;i<=*n;i++)
ans = (ans + (ll)dp[n][i] * (dp[n][i]-dp[n-][i]))%mod;//这里单独 (ll)dp[n][i] * (dp[n][i]-dp[n-1][i]) 会超精度
printf("%lld\n",ans);
}

下面是用滚动数组内存优化过的 用的now 和pre   (强行装逼, 不过倒腾了半个小时  now 和 pre 的关系

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+; int dp[][]; int main ()
{
int n;
scanf("%d",&n);
int now = ,pre = ;
dp[][] = ;
swap(now,pre);
for(int i=;i<=;i++)
dp[now][i] = ;
swap(now,pre);
for(int i=;i<=n;i++)
{
for(int j=;j<=*n;j++)
{
ll sum =;
for(int k=;k<=;k++)
{
if(j>=k)
sum = (sum+dp[pre][j-k])%mod;
else
break;
}
dp[now][j] = sum;
}
swap(now,pre);
}
ll ans = ;
for(int i=;i<=*n;i++)
{
ans = (ans + (ll)dp[pre][i]*(dp[pre][i] - dp[now][i]))%mod;
}
printf("%lld\n",ans);
}

别人的代码  (随便看看就好 主要是滚动优化 可以学一下(n&1)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 10005
#define Mod 1000000007
ll dp[][maxn];
int main()
{
ll n,m,i,j,k,sum,ans=;
scanf("%lld",&n);
dp[][]=;//这里是0
for(i=;i<=;i++)
dp[][i]=;
for(i=;i<=n;i++)
{
for(j=;j<=n*;j++)
{
sum=;
for(k=;k<=;k++)
{
if(j>=k)
sum=(sum+dp[(i-)%][j-k])%Mod;
else
dp[i%][j]=;
}
dp[i%][j]=sum;
}
}
for(i=;i<=*n;i++)
ans=(ans+dp[n%][i]*(dp[n%][i]-dp[(n-)%][i])%Mod)%Mod;
printf("%lld\n",ans);
}

51nod 1043 幸运号码(数位dp的更多相关文章

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

    题目链接:51nod 1043 幸运号码 题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况) dp[i][j] = dp[i-1][j-k] i & 1 :这里用滚动数组节 ...

  2. 1043 幸运号码 数位DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 设dp[i][j]表示前i位数中,i位数的和为j时的所有情况. 转 ...

  3. 51Nod 1043 幸运号码

    #include <stdio.h> #include <algorithm> using namespace std; typedef long long ll; ; ][] ...

  4. 51 Nod 1043 幸运号码(需重做好好体会)

    转自:http://www.cnblogs.com/geloutingyu/p/6329594.html 一道非常好的dp题目. 1043 幸运号码  基准时间限制:1 秒 空间限制:131072 K ...

  5. 51NOD 1623 完美消除 数位DP

    题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...

  6. 51nod 1232 完美数 数位dp

    1232 完美数 题目来源: 胡仁东 基准时间限制:2 秒 空间限制:131072 KB  如果一个数能够被组成它的各个非0数字整除,则称它是完美数.例如:1-9都是完美数,10,11,12,101都 ...

  7. 51nod 1043 数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 1043 幸运号码 基准时间限制:1 秒 空间限制:131072 ...

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

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

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

    幸运号码 思路: 传说中的数位dp: 不难发现,n(n<1000) ,那么,n个数的最大和为9*1000=9000: 对于9000*1000的时间范围,我们可以用dp来解决: dp[i][j], ...

随机推荐

  1. less语言特性(一) —— 变量

    近两年移动市场不断扩大,HTML5也逐渐升温,为了使我们前端工作更有效率,各种框架层出不穷,本章将介绍LESSCSS框架.LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS ...

  2. android 数据存储&lt;一&gt;----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局.线性布局,绝对布局.表格布局.标签布局等,各个布局能够嵌套的. 本文的布局文件就是线性布局的嵌套 <LinearLayout ...

  3. mysql查看和修改注释

    MySQL查看注释,MySQL修改注释,mysql查看注释,mysql修改注释 1.给大家做演示,这里随便创建一张学生表,代码如下: CREATE TABLE `student` ( `id` int ...

  4. 登录mysql出现/var/lib/mysql/mysql.sock不存在

    问题描述: 1.mysql安装完成后,使用 service mysqld start 总是出现 start failed. 2.使用mysql -uroot -p登录出现找不到 /var/lib/my ...

  5. [vue]实现父子组件数据双向绑定

    参考: http://www.cnblogs.com/xxcanghai/p/6124699.html <!DOCTYPE html> <html lang="en&quo ...

  6. kernel下nand flash的文件系统总结

    1.FLASH转换层(FTL) EXt2/EXT3/EXT4文件系统可以通过FTL实现对flash的支持,因为FTL可以将闪存flash模拟成磁盘结构. 在ext2文件系统的基础上上,为了保证数据的一 ...

  7. ES6(简)

    一. let.const 和 var let和const只在当前块级作用域中有效const用来声明常量var是全局作用域有效的 constants.js 模块export const A = 1;ex ...

  8. 下载mysql的源码包

  9. 谷歌插件--Advanced REST client

    早上在测试调用服务去获取数据的时候,因为自己的单元测试不是很熟悉,问了同事,同事给我介绍了一个插件Advanced REST client,这个可以在谷歌的“扩展与应用”中找打,使用 安装之后会提示要 ...

  10. python 文件操作 练习:取得文件的最后存取时间

    #coding=utf-8 import osimport time file_atime=int(os.path.getatime('d:\\a.txt'))print "file_ati ...