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. 【python-opencv】19-Canny边缘检测

    Canny 边缘提取的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近 ...

  2. Python3学习之路~2.3 字符串操作

    字符串操作 特性:不可修改 name="my \tname is alex" print(name.capitalize()) #首字母变大写 print('Alex LI'.ca ...

  3. RN例子,发送http请求,日期选择

    发送http请求 let map = { method: 'post', headers: { token: '', 'Content-Type': 'application/json' }, bod ...

  4. uvloop —— 超级快的 Python 异步网络框架

    简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...

  5. 共用tableview一个继承类里面有

    里面的复用cell会不会混在一起呢?

  6. #C++初学记录(ACM试题2)

    Max Sum Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-seq ...

  7. redis和memcached相关

    应该选择哪一种缓存机制 redis相较于memcached更加年轻,功能更加强大. 对小型静态数据进行缓存处理,最具代表性的例子就是HTML代码片段.使用memcached所消耗内存更少. 其他情况下 ...

  8. MFC工具栏的创建、设计与使用实例

    本文通过实例说明MFC工具栏的创建.设计和使用方法,包括三个demo.       demo1:创建一个工具栏 C++代码 //摘抄自MSDN demo1 (创建一个工具栏) 1.Create a t ...

  9. MySQL从删库到跑路(五)——SQL查询

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 1.查询所有字段 在SELECT语句中使用星号“”通配符查询所有字段在SELECT语句中指定所有字段select f ...

  10. Assets.xcassets 应用

    1.应用 Assets.xcassets :用来存放图像资源文件 给项目添加 AppIcon 时图标要用 png 格式的,不要用其他格式.当是其它图片格式时 ,不要仅仅修改其后缀名,若仅仅修改后缀名, ...