JZOJ 5436. 【NOIP2017提高A组集训10.30】Group
来源:互联网 发布:广东开放大学网络 编辑:程序博客网 时间:2024/05/21 01:27
题目
给定n个数,将这n个数分为若干组,求每一组最大值与最小值的差的和不超过K的方案数。
题解
暴力可以过
这时,一个有序的序列会比一个无序的序列更容易被想到做法。
此时有序胜无序
题目的条件:
①只有每组的最大/最小值会对答案有贡献。
②最大值与最小值的差的和受到了不超过K的限制。
如果去掉条件②那很好做,就是斯特林数。
设
加上了条件②,我们第二维的设法可能要改一下。
如果第二维只表示分了j组,在不知道每组的最大值/最小值的情况下很难去设第三维。这是最困惑人的地方。
由于不能直接确定每组的最大值和最小值导致
表示不了目前确切的
设
分两种情况。
①新开一组。
②继续把新元素分入旧组。
用滚动数组就可以将空间控制在范围之内。
正确性
由于序列的无序性,我们排下序,不管是有没有匹配完的组的max-min,设min的位置是j1,max的位置是j2,那么这一组对答案的贡献为
总结
①对于DP题目明确题目关键条件(老梗不继续吹)
②若有困惑你的条件,试想将这个条件去掉怎么做,然后再加上这个条件,分类讨论的情况大概跟去掉这个条件后分类讨论的情况差不多。
③DP不一定要表现形象的东西(这也是老梗),一个数看看能否通过拆散(这种老套路的题目很多啊)从而有利于DP转移。
④如果序列有无序性,那么此时可以排排序。
代码
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define N 210#define LL long long#define mo 1000000007#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;LL i,j,k,l,v,n,m,ans,tmp,o;LL a[N];LL f[2][N][N*5];bool cmp(LL x,LL y){return x<y;}void add(LL &x,LL y){x=(x+y)%mo;}int main(){ scanf("%lld%lld",&n,&m); fo(i,1,n)scanf("%lld",&a[i]); sort(a+1,a+n+1,cmp); o=0; f[o][0][0]=1; fo(i,1,n){ o=1^o; memset(f[o],0,sizeof(f[o])); fo(j,0,i-1){ tmp=j*(a[i]-a[i-1]); fo(k,0,m){ if(tmp+k>m)break; v=tmp+k; add(f[o][j+1][v],f[o^1][j][k]); add(f[o][j][v],f[o^1][j][k]); if(j){ add(f[o][j][v],(f[o^1][j][k]*j)%mo); add(f[o][j-1][v],(f[o^1][j][k]*j)%mo); } } } } fo(i,0,m)ans=(ans+f[o][0][i])%mo; printf("%lld\n",ans); return 0;}
- JZOJ 5436. 【NOIP2017提高A组集训10.30】Group
- JZOJ 5436. 【NOIP2017提高A组集训10.30】Group
- 【JZOJ 5436】【NOIP2017提高A组集训10.30】Group
- 【NOIP2017提高A组集训10.30】Group
- JZOJ 5435. 【NOIP2017提高A组集训10.30】Graph
- JZOJ 5434. 【NOIP2017提高A组集训10.30】Matrix
- 【JZOJ 5434】【NOIP2017提高A组集训10.30】Matrix
- 【JZOJ 5435】【NOIP2017提高A组集训10.30】Graph
- JZOJ 5434. 【NOIP2017提高A组集训10.30】Matrix
- JZOJ5436. 【NOIP2017提高A组集训10.30】Group DP
- jzoj5436 【NOIP2017提高A组集训10.30】Group
- [JZOJ5436]【NOIP2017提高A组集训10.30】Group
- JZOJ 5432. 【NOIP2017提高A组集训10.28】三元组
- 【JZOJ 5432】【NOIP2017提高A组集训10.28】三元组
- JZOJ 5407. 【NOIP2017提高A组集训10.21】Deep
- JZOJ 5408. 【NOIP2017提高A组集训10.21】Dark
- 【JZOJ 5409】【NOIP2017提高A组集训10.21】Fantasy
- JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
- Go语言常量
- 阻止浏览器复制方法
- 【Java开发-linux工具】SecureCRT配置
- Eigen的简单用法
- 文本数据处理—结合mysql模拟实现消息队列
- JZOJ 5436. 【NOIP2017提高A组集训10.30】Group
- 每日练习10.31
- Toolbar的使用
- SPI三线制 四线制
- 160
- spring整合aspectj实现aop的一个简单案例(xml)
- 伯努力抛硬币实验连续出现n个正面的概率
- Java进阶(二)当我们说线程安全时,到底在说什么
- SpringMVC的拦截器和过滤器的区别与联系