基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
 收藏
 关注
将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种。由于数据较大,输出Mod 10^9 + 7的结果即可。

Input
输入1个数N(1 <= N <= 50000)。
Output
输出划分的数量Mod 10^9 + 7。
Input示例
6
Output示例
4

这个DP想得真叫我累啊,还想不出来。后来问了夹克老师,发现这个DP真是经典啊。

用dp[i][j]表示j个数组成i的个数。那么对于dp[i][j]每一个j来说,注意是对于每一个j来说,来源就是两个,一个就是插入j时的dp[i-j][j-1]个数。

然后就是因为要不同整数,不同的来源在哪里,就是将[i-j][i](其含义是i个数组成了i-j)中的每一个数加1,这点这是奇妙啊,就组成了dp[i][j]的剩余部分。

所以dp[i][j]=dp[i-j][i]+dp[i-j][i-1]

这个题真是好题。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; const int maxn = 50000 + 100;
const int mod = 1e9 + 7;
int dp[maxn][350]; int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout); int n;
scanf("%d", &n);
dp[0][0] = 1;
for (int i = 1; i<7; i++)
{
for (int j = 0; j <= n; j++)
{
if (j - i >= 0)
dp[j][i] = (dp[j - i][i] + dp[j - i][i - 1]) % mod;
}
}
int ans = 0;
for (int i = 1; i<350; i++)
ans = (ans + dp[n][i]) % mod;
cout << ans << endl; return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. Java学习——连接数据库
  2. MyBatis与Hibernate的比较
  3. MEF搜索范围
  4. hdu 1251 字典树的应用
  5. How to change drive in cygwin
  6. javascript中的defer是什么?
  7. 应用 JD-Eclipse 插件实现 RFT 中 .class 文件的反向编译
  8. CentOS 修改线程数限制等(limits.conf)
  9. 如何计算ModBus超时时间?
  10. kindeditor编辑器修改文本后保存时发现获取到的内容还是修改前的文本内容
  11. 使用jQuery动态克隆表格,并且添加至div中(使用前需要引入jQuery)
  12. Go语言中的闭包
  13. javaWeb锁屏的简单实现
  14. 关于js键盘事件的例子
  15. vue-cli keep-alive用法以及activated,deactivated
  16. 移动端web页面开发常用的头部标签设置
  17. Mysql中Join用法及优化
  18. 联赛emacs配置
  19. 找&quot;数学口袋精灵&quot;bug
  20. u-boot引导内核过程

热门文章

  1. IOS 常用功能代码
  2. 前端学习笔记系列一:6 一种新的css预编译器stylus
  3. 三 Hibernate持久化状态&amp;主键生成策略
  4. spring源码第一章_获取源码并将源码转为eclipse工程
  5. SChema 多个属性的设置学习
  6. 【LeetCode】寻找右区间
  7. ZOJ 3802 Easy 2048 Again 状态DP
  8. Netty的出现
  9. php笔记04
  10. 【剑指Offer】面试题32 - II. 从上到下打印二叉树 II