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], ...
随机推荐
- 使用GIT SUBTREE集成项目到子目录(转)
原文:http://aoxuis.me/post/2013-08-06-git-subtree 使用场景 例如,在项目Game中有一个子目录AI.Game和AI分别是一个独立的git项目,可以分开维护 ...
- 深入浅出REST(转载)
add by zhj: 参考http://zh.wikipedia.org/zh/REST 需要注意的是,REST是设计风格而不是标准,它也并没有与哪种协议绑定.不过,我们常按REST设计风格来使用H ...
- javaScript 载入自执行
1.注册可以直接调用f()中的b(),c(),d() .原因?自己想. <!DOCTYPE html> <html> <head> <meta charset ...
- 高性能MySQL中的三星索引
高性能MySQL中的三星索引 我对此提出了深深的疑问: 一星:相关的记录指的是什么??(相关这个词很深奥,“相关部门”是什么部门) 二星:如果建立了B-Tree(B+Tree)索引,数据就有序了.三星 ...
- PAT 1068 Find More Coins[dp][难]
1068 Find More Coins (30)(30 分) Eva loves to collect coins from all over the universe, including som ...
- NuGet:自定义配置信息(2)
有些类库项目打包后,如何让别人引用的时候自动添加上对应的配置项目呢,比如EntityFramework的NuGet包,打开后可以看到类似下面的结构: 空白处右击——Add Content Folder ...
- iOS学习之VFL语言简介
什么是VFL语言 VFL(Visual Format Language),“可视化格式语言”. VFL是苹果公司为了简化autolayout的编码而推出的抽象语言. 语法说明 H:[cancelBut ...
- 实现对多维数组按照某个键值排序的两种方法(array_multisort和array_sort)
实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种:array_multisort()函数对多个数组或多维数组进行排序. //对数组$ ...
- Leetcode: Repeated DNA Sequence
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- C#中DataTable
.C#中DataTable技术学习 2009-09-10 14:37:18 阅读1496 评论0 字号:大中小 订阅 . 1.在DataTable中执行DataTable.Select(" ...