题目:http://acm.hdu.edu.cn/showproblem.php?pid=5230

题意:给定n,c,l,r。求有多少种方法从1~n-1选取任意k数每个数的权重为其下标,使得这些数字之和加上c之后在l,r范围内。

题解:第一反应是计数01包,但是范围给定的n太大,TLE。。。 然后仔细想想,不就是求l~r范围内不重复的整数划分数嘛。

dp[i][j]表示j这个数字,当前的拆分拥有i个拆分数时的方案数。

先考虑允许重复数字 : dp[i][j] = dp[i][j - i] + dp[i - 1][j - 1];

考虑分成两类,

1、dp[i][j - i]:这种拆分方案(拥有i个数字的拆分方案),如果没有1,就比如7 = 3 + 4这样,然后每个数字都加上一,

就变成了9 = 5 + 4。所以dp[2][9]可以由dp[2][7]转化过来。当然7 = 1 + 6也是合法解。

2、dp[i - 1][j - 1]:这种拆分方案有1,比如4 = 3 + 1,那么我可以截去那个1,变成3 = 3,然后加上最后那个1,就变成了

4 = 3 + 1,所以dp[2][4]可以由dp[1][3]转化过来。

这里提供了一种思维--对数字的组合分类以及每个数都+1的状态转移。这里对是否有1存在做了一个分类。仿照这个思想我们去定义新的dp[i][j].

dp[i][j]表示j这个数字,当前的拆分拥有i个不重复拆分数时的方案数。

按照上述的思维:

(a) 当不存在1的时候,dp[i][j]可以由dp[i][j-i]转移而来;

(b) 当存在1的时候,由于dp的定义只存在一个1。那么我们把这个1单独拎出来,然后对剩下的i-1分成j-i组 dp[i][j]=dp[i-1][j-i];

综合上述的两种情况:dp[i][j] = dp[i][j - i] + dp[i - 1][j - i];

当这里,这道题目还是没法ac。。。因为如果我们用普通的方法去求解这个dp,内存吃不住的,用滚动数组优化一下。

(真心不容易,,,还有一些细节要处理)

ac_code:

#include <cstdio>
#include <iostream>
#include <cstring>
#define mt(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
int dp[][];
const int mod=;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,c,l,r;
scanf("%d %d %d %d",&n,&c,&l,&r);
mt(dp);
if(c>r)
{
cout<<<<endl;
continue;
}
dp[][]=;
int L=l-c;
int R=r-c;
int ans= (L==);// 对0的情况做一个特判断
L=max(,L);
//R=max(n-1,R);
int now=;
for(int i=;i*(i+)/ <= max(R,n-);i++)// 个数 由于是从1开始枚举 那么枚举i个数字的和最小为 i*(i+1)/2 还有就是能取的上限也要注意
{
for(int j=i*(i+)/;j<=R;j++) // 分数 同上,从最小的开始,优化
{
dp[now][j]=(dp[now][j-i]+dp[!now][j-i])%mod; // 滚动数组
if(j>=L && j<=R)
{
ans+=dp[now][j];
ans%=mod;
}
}
memset(dp[!now],,sizeof(dp[!now]));
now=!now;
}
printf("%d\n",ans);
}
return ;
}

hdu 5230 整数划分 dp的更多相关文章

  1. 【NOI2019模拟2019.6.27】B (生成函数+整数划分dp|多项式exp)

    Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难 ...

  2. 51nod 1201 整数划分 dp

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB   收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...

  3. bzoj 3612 [Heoi2014]平衡——整数划分(dp)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 因为力矩的缘故,变成了整数划分. 学习到了整数划分.就是那个图一样的套路.https: ...

  4. hdu 1028 & hdu 1398 —— 整数划分(生成函数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分,每个数可以用无限次: 所以构造 f(x) = (1+x+x2+x3+...)(1+x2+x ...

  5. bzoj 3612: [Heoi2014]平衡【整数划分dp】

    其实就是-n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551 ...

  6. 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)

    这是一道典型的整数划分题目,适合正在研究动态规划的同学练练手,但是和上一个随笔一样,我是在Coursera中评测通过的,没有找到适合的OJ有这一道题(找到的ACMer拜托告诉一声~),这道题考察得较全 ...

  7. 大概是:整数划分||DP||母函数||递推

    整数划分问题 整数划分是一个经典的问题. Input 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) Output 对于每组输入,请输出六行. ...

  8. HDU acm1028 整数划分 递归问题(递推)

    我们用递归+记忆化的方法来解决普通整数划分问题:定义 f(n,m)为将整数n划分为一系列整数之和,其中加数 最大不超过m. 得到下面的递推关系式: 当n==1 || m==1 只有一种划分,即 1 或 ...

  9. zzulioj--1719--小胖的疑惑(整数划分+dp打表)

    1719: 小胖的疑惑 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 108  Solved: 51 SubmitStatusWeb Board De ...

随机推荐

  1. js中的一些隐式转换和总结

    js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 [] == true; //false [] ...

  2. python人生如初见之初见yield

    今天学习爬虫Scrapy框架搭建的时候,了解了yield的用法.了解一个东西,无外乎 WHAT? HOW? WHY? WHAT yield英文意思是屈服,退位,放弃.额...其实它是Python中的一 ...

  3. Mac -- pkg-config: exec: "pkg-config": executable file not found in $PATH

    just run: brew install pkg-config

  4. jquery获取html中当前元素对象,以及父对象,相邻的上一个对象,或下一个对象

    jsp代码: <span><input type="hidden" value="1" id="newInfo">& ...

  5. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  6. PropertyValuesHolder学习

    package com.loaderman.customviewdemo; import android.animation.ObjectAnimator; import android.animat ...

  7. Windows10+VMware Workstation Pro+Ubuntu 16.04+Hadoop-2.6.5+IDEA环境搭建(单机&伪分布式&集群)

    (注:下面出现的"czifan"为用户名,需替换成自己的用户名) 本篇博客是在实践该篇博客的过程中的一些补充和修改~ 0 - 安装VMware Workstation Pro 首先 ...

  8. 【精华】PHP网站验证码不显示的终结解决方案

    PHP网站验证码不显示,这个是个很基础的PHP问题了,不过有点时候会比较让开发者比较头疼了.很多解决方案仅仅考虑到gd2,却忽略了另外一个很重要的因素了,相信在了解本教程之后,验证码不显示基本上就不算 ...

  9. osg define shape(create box)

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osgViewer/Viewer> #include ...

  10. 使用Async-profiler 对程序性能优化实战

    原文在简书上, https://www.jianshu.com/p/f8336b835978 1.背景 目前有一个kafka消费者工程,此工程会消费kafka中的消息,并通过fastjson解析该消息 ...