博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1043 幸运号码 数位DP
阅读量:4676 次
发布时间:2019-06-09

本文共 1283 字,大约阅读时间需要 4 分钟。

设dp[i][j]表示前i位数中,i位数的和为j时的所有情况。

转移的时候和普通的数位dp是一样转移的,但是如果你压缩了空间的话,就是用滚动数组的话,记录情况数就要多开一个变量来保存,

 

然后看看怎么排除前导0的情况。

如果产生的和值是j,然后前i - 1位产生的和值也是j,那么第i为就是前导0了。需要排除。

然后前n部分的和值的所有情况(需要排除前导0) * 后n部分的和值情况。就是答案。

 

#include 
#include
#include
#include
#include
#include
#define IOS ios::sync_with_stdio(false)using namespace std;#define inf (0x3f3f3f3f)typedef long long int LL;#include
#include
#include
#include
#include
#include
#include
#include
const int MOD = 1e9 + 7;LL dp[2][9 * 1000 + 20];void work() { int n; cin >> n; dp[0][0] = 1; int now = 0; for (int i = 1; i <= n; ++i) { now = !now; for (int k = 0; k <= 9 * i; ++k) { LL sum = 0; for (int j = 0; j <= 9; ++j) { if (k >= j) { sum += dp[!now][k - j]; if (sum >= MOD) sum %= MOD; } } dp[now][k] = sum; } } LL ans = 0; for (int i = 1; i <= 9 * n; ++i) {// assert(dp[now][i] - dp[!now][i] >= 0); ans += ((dp[now][i] - dp[!now][i] + MOD) % MOD * dp[now][i]) % MOD; if (ans >= MOD) ans %= MOD; } cout << ans << endl;}int main() {#ifdef local freopen("data.txt", "r", stdin);// freopen("data.txt", "w", stdout);#endif work(); return 0;}
View Code

 

转载于:https://www.cnblogs.com/liuweimingcprogram/p/6323673.html

你可能感兴趣的文章
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
Python入门学习笔记4:他人的博客及他人的学习思路
查看>>
webstorm里直接调用命令行
查看>>
关联规则算法之FP growth算法
查看>>
对数组序列进行洗牌
查看>>
决策树
查看>>
团队作业
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>
win7,Ubuntu 12.04 双系统修改启动项顺序三方法
查看>>
python--列表推导式和生成表达式
查看>>
P - Psychos in a Line 单调队列
查看>>
POJ 2653 Pick-up sticks(计算几何)
查看>>
大型网站高并发的架构演变图-摘自网络
查看>>
8丶运行及总结
查看>>
Unity获取手机的电量时间
查看>>
Spring框架:Spring容器具体解释
查看>>
MongoDB 3.2 从安装到使用。
查看>>
再次说搜索
查看>>
spring测试
查看>>