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. HTML5 web 存储

    简介: HTML5 web 存储,一个比cookie更好的本地存储方式. 首先我们先了解一下: 什么是 HTML5 Web 存储? 使用html5可以在本地存储用户的浏览数据. 早些时候,本地存储使用 ...

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

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

  3. android(五)----使用WakeLock使Android应用程序保持后台唤醒

    在使用一些产品列如微信.QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了. 但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消 ...

  4. 事务控制及try catch

    一.事务控制 BEGIN TRY BEGIN TRAN; DECLARE @aaa NVARCHAR(MAX); SET @aaa = 9 / 0; COMMIT TRAN;END TRYBEGIN ...

  5. 前端 HTML 简介

    HTML HTML是一个网页的主体部分,也是一个网页的基础.因为一个网页可以没有样式,可以没有交互,但是必须要有网页需要呈现的内容.所以HTML部分是整个前端的基础. HTML,全称是超文本标记语言( ...

  6. glide从入门到精通使用

    介绍 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题.Java有牛逼轰轰的Maven和Gradle. Golang亦有godep.govendor.glide.gvt.gopac ...

  7. Spark Storage(二) 集群下的broadcast

    Broadcast 简单来说就是将数据从一个节点复制到其他各个节点,常见用于数据复制到节点本地用于计算,在前面一章中讨论过Storage模块中BlockManager,Block既可以保存在内存中,也 ...

  8. String.getBytes()未设置字符集导致打印的pdf乱码

    如果不设置字符集会选择系统字符集,系统也没设置,会选iso-8859-1 导致汉字乱码,成为?

  9. js中去除字符串两边的空格

    在提交表单的时候会需要去除字符串两边的空格,代码如下: /*去除字符串两边空格*/ String.prototype.trim = function() { return this.replace(/ ...

  10. Tomcat修改端口和编码配置

    1.打开Tomcat中server.xml文件,找到原本的8080,修改成没被占用的端口: 2.在这个标签里增加 URIEncoding="utf-8",修改请求的编码.