51nod 1043 幸运号码(数位dp
输入N(1<= N <= 1000)
输出幸运号码的数量 Mod 10^9 + 7
1
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的更多相关文章
- 51nod 1043 幸运号码(数位dp)
题目链接:51nod 1043 幸运号码 题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况) dp[i][j] = dp[i-1][j-k] i & 1 :这里用滚动数组节 ...
- 1043 幸运号码 数位DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 设dp[i][j]表示前i位数中,i位数的和为j时的所有情况. 转 ...
- 51Nod 1043 幸运号码
#include <stdio.h> #include <algorithm> using namespace std; typedef long long ll; ; ][] ...
- 51 Nod 1043 幸运号码(需重做好好体会)
转自:http://www.cnblogs.com/geloutingyu/p/6329594.html 一道非常好的dp题目. 1043 幸运号码 基准时间限制:1 秒 空间限制:131072 K ...
- 51NOD 1623 完美消除 数位DP
题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...
- 51nod 1232 完美数 数位dp
1232 完美数 题目来源: 胡仁东 基准时间限制:2 秒 空间限制:131072 KB 如果一个数能够被组成它的各个非0数字整除,则称它是完美数.例如:1-9都是完美数,10,11,12,101都 ...
- 51nod 1043 数位dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 1043 幸运号码 基准时间限制:1 秒 空间限制:131072 ...
- xbz分组题B 吉利数字 数位dp入门
B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...
- AC日记——幸运号码 51nod 1043
幸运号码 思路: 传说中的数位dp: 不难发现,n(n<1000) ,那么,n个数的最大和为9*1000=9000: 对于9000*1000的时间范围,我们可以用dp来解决: dp[i][j], ...
随机推荐
- 利用VS正则替换删除文本行首数据等字符
删除以数字开头的加‘.’的行首序号 ^[0-9][0-9][.]
- div+css网页标准布局实例教程(二)
五.布局页面——头部和导航 有了上边的基础,下面的任务就是要利用html和css制作完成一个完整的网页了.先从头部开始,第三小节时我们已经把整体框架给搭建好了,就像盖房子一样,整体结构已经出来了,下面 ...
- IO流(5)判断功能
判断功能: * public boolean isDirectory():判断是否是目录 * public boolean isFile():判断是否是文件 * public boolean exis ...
- python 基础3 函数
函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或 ...
- 网络比总线差多了 除非是真正的mpp并行架构
网络比总线差多了 除非是真正的mpp并行架构 楼方鑫HZproxy里内置一个memory db,可以解决跨库查询中最难的部份.楼方鑫HZ 2015/1/24 21:52:33@joe 用两层DB就好解 ...
- SparkSQL UDF两种注册方式:udf() 和 register()
调用sqlContext.udf.register() 此时注册的方法 只能在sql()中可见,对DataFrame API不可见 用法:sqlContext.udf.register("m ...
- (转)ArrayList和LinkedList的几种循环遍历方式及性能对比分析
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
- hdu1305Immediate Decodability(字典树)
这题看是否 这题能A是侥幸,解决的办法是先存一下输入的字符串,进行排序. Problem Description An encoding of a set of symbols is said to ...
- 获取多达 16GB 的 Dropbox 免费空间!
Dropbox官网
- 用Anaconda安装TensorFlow+keras
检测目前安装了哪些环境变量:conda info --envs 查看当前有哪些可以使用的tensorflow版本:conda search --full -name tensorflow 查看ten ...