题目大意:

给定\(n\)个数\(a[1]\sim a[n]\),让你把它分为若干个集合,使每个集合内最大值与最小值的差的总和不超过\(K\)。问总方案数。

解题思路:

一道很神的dp题。

首先将数进行排序,然后将这些数扔数轴上,则集合价值相当于在数轴上覆盖这些点所用的最短线段的长度(当然长度可以为0)。

考虑dp,设\(f[i][j][k]\)表示考虑了前\(i\)个点,目前还未确定右端点的集合还有\(j\)条,目前的总价值为\(k\),则

不论如何,新加进\(a[i+1]-a[i]\)这条线段,对\(j\)个集合均有影响,因此会增加价值为\((a[i+1]-a[i])\times j\),设其为\(t\)。

转移分四种情况:

1. 该点单独成一个集合,则\(j\)不变,仅有1种情况,\(f[i+1][j][k+t]+=f[i][j][k]\);
2. 该点作为某个集合的中间元素,则\(j\)也不变,对于\(j\)个集合都有可能,因此\(f[i+1][j][k+t]+=f[i][j][k]\times j\);
3. 该点作为一个集合的起点,则集合数多了1,仅有1种情况,\(f[i+1][j+1][k+t]+=f[i][j][k]\);
4. 该点作为一个集合的终点,则集合数少了1,对于\(j\)个集合都有可能,因此\(f[i+1][j−1][k+t]+=f[i][j][k]\times j\)。

答案为\(\sum\limits_{i=0}^K f[n][0][i]\)。

时空复杂度均为\(O(n^2K)\),空间复杂度可以用滚动数组优化到\(O(nK)\)。

C++ Code:

#include<bits/stdc++.h>
using namespace std;
const int md=1e9+7;
int n,K,cur,a[201],dp[2][201][1001];
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>K;
for(int i=1;i<=n;++i)cin>>a[i];
sort(a+1,a+n+1);
dp[1][1][0]=dp[1][0][0]=cur=1;
for(int i=1;i<n;++i){
const int otr=cur;
memset(dp[cur^=1],0,sizeof dp[0]);
for(int j=0;j<=i;++j){
const int t=j*(a[i+1]-a[i]);
for(int k=0;k+t<=K;++k){
dp[cur][j][k+t]=(dp[cur][j][k+t]+dp[otr][j][k]*(j+1ll)%md)%md;
if(j<n)dp[cur][j+1][k+t]=(dp[cur][j+1][k+t]+dp[otr][j][k])%md;
if(j)dp[cur][j-1][k+t]=(dp[cur][j-1][k+t]+1ll*dp[otr][j][k]*j%md)%md;
}
}
}
int ans=0;
for(int i=0;i<=K;++i)
ans=(1ll*dp[cur][0][i]+ans)%md;
cout<<ans<<endl;
return 0;
}

[Codeforces 626F]Group Projects的更多相关文章

  1. Codeforces 626F Group Projects(滚动数组+差分dp)

    F. Group Projects time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  2. Codeforces 626F Group Projects (DP)

    题目链接  8VC Venture Cup 2016 - Elimination Round 题意  把$n$个物品分成若干组,每个组的代价为组内价值的极差,求所有组的代价之和不超过$k$的方案数. ...

  3. 【CodeForces】626 F. Group Projects 动态规划

    [题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...

  4. Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****

    F. Group Projects   There are n students in a class working on group projects. The students will div ...

  5. 8VC Venture Cup 2016 - Elimination Round F. Group Projects dp

    F. Group Projects 题目连接: http://www.codeforces.com/contest/626/problem/F Description There are n stud ...

  6. [Codeforces626F] Group Projects (DP)

    Group Projects Description There are n students in a class working on group projects. The students w ...

  7. 8VC Venture Cup 2016 - Elimination Round F - Group Projects dp好题

    F - Group Projects 题目大意:给你n个物品, 每个物品有个权值ai, 把它们分成若干组, 总消耗为每组里的最大值减最小值之和. 问你一共有多少种分组方法. 思路:感觉刚看到的时候的想 ...

  8. [CF626F]Group Projects

    [CF626F]Group Projects 题目大意: 有一个长度为\(n(n\le200)\)的数列\(\{A_i\}\),将其划分成若干个子集,每个子集贡献为子集\(\max-\min\).求子 ...

  9. codeforces A. Group of Students 解题报告

    题目链接:http://codeforces.com/problemset/problem/357/A 题目意思:将一堆人分成两组:beginners 和 intermediate coders .每 ...

随机推荐

  1. Scalable Web Architecture and Distributed Systems

    转自:http://aosabook.org/en/distsys.html Scalable Web Architecture and Distributed Systems Kate Matsud ...

  2. 【JavaScript框架封装】实现一个类似于JQuery的动画框架的封装

    // 动画框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({}); // 不需要参与链式访问的 ...

  3. ios风格的时间选择插件

    1.起因 在上个项目中,客户希望时间选择插件可以是ios风格的那种,但是找了很久,发现并没有用vue的ios风格时间插件,于是自己便自己造了一个轮子. 2.插件效果 3.插件依赖以及安装使用 插件依赖 ...

  4. JavaScript:进制转换。

    最近做了一些进制的转换的点. 十进制转二进制: let a = 45; a.toString(2); //"101101" let b = 123; b.toString(2); ...

  5. CF140E New Year Garland (计数问题)

    用$m$种颜色的彩球装点$n$层的圣诞树.圣诞树的第$i$层恰由$a_{i}$个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不 同.求有多少种装点方案,答案对$p$取模 ...

  6. FFMpeg 常用命令格式转换,视频合成

    FFmpeg都是命令行的,用起来肯定不方便.但是,这对技术宅应该不成问题.下面,我就罗列一些比较实用的使用方法吧. FFmpeg的下载与安装 FFmpeg是开源的.但我们不必去下载它的源代码.下载已经 ...

  7. Problem 10

    Problem 10 # Problem_10.py """ The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. ...

  8. Scrum敏捷开发过程

    首先来说一下什么是敏捷开发: 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 怎么理解呢?首先,我们要理解它不是一门技术,它是一种开发方法,也就是一种软件开 ...

  9. 纯js编写验证信息提示正则匹配数字,字母,空值

    1.显示效果 2,html结构 <div class="border_bg"> <div id="upcCode" style="p ...

  10. SQL-Oracle-创建Dblink

    create database link DBLINK_IMARK_RAC connect to imark identified by imarkDB12345 using '(DESCRIPTIO ...