[2017纪中10-30]Group DP+差分优化_DOFYPXY的博客-程序员秘密

技术标签: dp  前缀和与差分  

题面
考虑先将数组排序,从左往右一个个分组,每一组的极差拆成:-第一个加进该组的数(-a[l])+最后一个加进该组的数(+a[r])。于是设计状态f[i][j][k]表示分到第i个,有j个只填了开始没填结束,当前极差和为k。但这样k的范围会很大。
考虑差分优化,把-a[l]+a[r]写成(-a[l]+a[l+1])+(-a[l+1]+a[l+2])+…+(-a[r-1]+a[r])。于是在转移时,每一个未分完的组都要加a[i]-a[i-1]。
具体的:设v=j*(a[i]-a[i-1])+k。f[i-1][j][k]可以转移到四种情况:
a[i]新建一组不作为结束:f[i][j+1][v]+=f。
a[i]新建一组作为结束:f[i][j][v]+=f。
a[i]加入旧组不作为结束:f[i+1][j][v]+=f*j。
a[i]加入旧组作为结束:f[i+1][j-1][v]+=f*j。
代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
#define up(a,b) a=((a)+(b))%mod
using namespace std;
int n,mxk,a[210];
ll f[2][210][1010];
const int mod=1000000007;
int main()
{
    scanf("%d%d",&n,&mxk);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);    
    f[0][0][0]=1;   
    for(int i=0;i<n;i++)
    {
        int b=i&1,s=0;
        memset(f[b^1],0,sizeof(f[b^1]));
        for(int j=0;j<=i;j++,s+=a[i+1]-a[i])
            for(int k=0;k<=mxk-s;k++)
            {
                up(f[b^1][j+1][k+s],f[b][j][k]);
                up(f[b^1][j][k+s],f[b][j][k]);
                up(f[b^1][j][k+s],f[b][j][k]*j%mod);
                if(j>0)up(f[b^1][j-1][k+s],f[b][j][k]*j%mod);
            }
    }
    ll ans=0;
    for(int k=0;k<=mxk;k++)
        up(ans,f[n&1][0][k]);           
    printf("%lld",ans); 
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DOFYPXY/article/details/78396490

智能推荐

entity、bo、vo、po、dto、pojo如何理解和区分?_weixin_34362991的博客-程序员秘密

Java开发过程中,基本实体类包都以entity或者model来称呼,可是不少项目中,却以Bo、Vo来命名,面试的时候,也有可能被问到这些问题。那么,这几者分别代表什么意思呢?Entity最常用实体类,基本和数据表一一对应,一个实体一张表。Bo(business object)代表业务对象的意思,Bo就是把业务逻辑封装为一个对象(注意是逻辑,业务逻辑),这个对象可以包括一个或多个其它的对象。通过调...

JavaScript的type属性等于text/html 例子_"js type\"text/html"_catoop的博客-程序员秘密

在使用javascript标签的时候,其中type最常用的就是

深入理解计算机系统之链接(三)_godspeedkaka的博客-程序员秘密

静态库的概念静态库就是由一组独立的可重定向目标文件封装而成的,在Unix系统中,静态库以一种称为归档(archive)的特殊文件存放在磁盘上。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个目标文件的大小和位置,存档文件名有后缀.a表示链接器如何使用静态库来解析引用在符号解析的阶段,链接器从左到右按照他们在编译器驱动程序命令行上出现的相同顺序来扫描可重定位目标文件和存档文件。(

后台怎样获取前台input的值?_大爱李志的博客-程序员秘密

在前台input中加入 runat="server"在后台中String ss = Request.Form["start"];

redis-desktop-manager的使用_在京奋斗者的博客-程序员秘密

实际工作环境中,Redis会安装在服务器上,我们想使用Redis服务就要使用Redis终端。 redis-desktop-manager便是来连接Redis服务并可供我们学习使用的。       首先,安装 redis-desktop-manager,大家可以到http://download.csdn.net/detail/u012453843/9820194这个地址下载安装包并进行安装。

code art_coekaa826620的博客-程序员秘密

PART ONE============= public void doGet(HttpServletRequest request, HttpServletResponse response) throws Servlet...

随便推点

基于Kafka的服务端用户行为日志采集_weixin_30379531的博客-程序员秘密

本文来自网易云社区作者:李勇背景随着互联网的不断发展,用户所产生的行为数据被越来越多的网站重视,那么什么是用户行为呢?所谓的用户行为主要由五种元素组成:时间、地点、人物、行为、行为对应的内容。为什么要做用户的行为分析?因为只有做了用户行为分析才能知道用户画像、才能知道用户在网站上的各种浏览、点击、购买背后的商业真相,从而给企业带来商业价值。网易美学是一个供用户发现和分享美妆及护肤的社区。既然是一个...

Python爬虫Scrapy(一)_Whale__Fall的博客-程序员秘密

ScrapyPython开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。 Scrapy运行流程1 引擎访问spider,询问需要处理的URL链接,spider收到请求,将需要处理的URL告诉引擎,然后将URL给引擎处理。...

Linux 内核之api_man 手册安装_zxy131072的博客-程序员秘密

Linux 内核之api_man 手册安装 开发环境:Ubuntu18.04,虚拟机virtual box1、安装XML格式转换sudo apt  install xmlto 2、在内核目录执行make mandocs   大概持续了半小时左右。3、安装sudo make installmandocs 4、使用man printk...

让ImageView尺寸适应图片比例和屏幕_imageview适应图_宝华的小岛的博客-程序员秘密

是否经常会遇到这种情况:我怕们需要一个ImageView,一般情况下既想让它宽度适应屏幕,又想让它高度适应图片。但是图片比例和屏幕比例没有关联,我们给ImageView设置尺寸,要不就是充满屏幕,要不就是包裹内容,固定尺寸无法应对图片比例不确定的情况。所以我们需要写一个工具方法,来调整控件尺寸,达到既适应图片,又适应屏幕的目的。看代码:工具类public class ImageViewUtil

干货分享--iOS及Mac开源项目和学习资料【超级全面】_weixin_30835933的博客-程序员秘密

原文出处:codecloudhttp://www.kancloud.cn/digest/ios-mac-study/84557转载于:https://www.cnblogs.com/brance/p/5129512.html

推荐文章

热门文章

相关标签