jdoj 2171: Grape

题意

题目大意

一个农场的葡萄架上挂着n串葡萄,若取一个葡萄就会获得与其相应的美味值。对于连续的k串葡萄,最多取b串,最少取a串,

问能够获得的最大美味值为多少

数据范围

n<=10000,0<=a<=b<=k<=10

分析

考虑到在选到第i串葡萄时,影响到决策的只有i前面k串葡萄

f[i] [sta] 表示,考虑完第i串葡萄,后k串葡萄的状态为sta时的最大美味值

小技巧

  1. 看看n的范围,再想想我们的状态表示,可得,每次转移只需要前一个状态的信息,所以我们可以用i&1表示当前位置,那么(i+1)&1就是下一个位置

  2. 为了方便,不妨将这k串葡萄中的距离i最远的一串葡萄使用最后一个二进制位表示, 这样,我们在状态转移时>>1即可

只有在a <= cnt[sta] <= b时才考虑转移,转移时状态或上 1<<k,不转移时在合法的时候取最大值即可。

向前推进max

/*

5 3 1 2

-1 1 2 -2 3

now_ans = 6

ans = 9

*/

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
const int N = 11;
const int MAX = (1<<N)-1;
#define lowbit (i&-i) inline int read()
{
int x=0,f=1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')f=-1;ch = getchar();}
while(ch >='0' && ch <='9'){x=(x<<1)+(x<<3)+ch-'0';ch = getchar();}
return x*f;
} int n,k,a,b,sum, max_k;
int f[2][1<<N], val[10000+9], cnt[1<<N]; int getone(int i) {
int res = 0;
while(i) ++res, i -= lowbit;
return res;
}
int getval(int i) {
int res = 0, pos = 1;
while(i) {
if(i&1) res += val[pos];
i = i>>1, ++pos;
}
return res;
} void pre() {
n = read(), k = read(), a = read(), b = read();
for(int i = 1; i <= n; i++) val[i] = read(), sum += val[i];
max_k = (1<<k)-1;
for(int i = 0; i <= max_k; i++) cnt[i] = getone(i);
for(int i = 0; i <= max_k; i++) if(cnt[i]>=a && cnt[i]<=b) f[k&1][i] = getval(i);
} void solve() {
for(int i = k; i < n; i++) {//小技巧
int o = (i&1), op = (o+1)&1;//o表示当前第一维,op表示下一个第一维
memset(f[op], -0x3f, sizeof(f[op]));
for(int j = 0; j <= max_k; j++) if(cnt[j]>=a && cnt[j]<=b) {
int tmp1 = (j>>1), tmp2 = ((j|(1<<k))>>1);
//tmp1表示不选,tmp2表示选
if(cnt[tmp1]>=a && cnt[tmp1]<=b) f[op][tmp1] = max(f[op][tmp1], f[o][j]);//不减?
if(cnt[tmp2]>=a && cnt[tmp2]<=b) f[op][tmp2] = max(f[op][tmp2], f[o][j]+val[i+1]);
}
}
int ans = -2147483646;
for(int j = 0; j <= max_k; j++) if(cnt[j]>=a && cnt[j]<=b) ans = max(ans, f[n&1][j]);
printf("%d\n",ans*2-sum);
}
int main() {
pre();
solve();
return 0;
}

jdoj 2171: Grape的更多相关文章

  1. grape动态PHP结构(三)——API接口

    一.app视图与控制器

  2. grape动态PHP结构(二)——管理后台

    一.概述

  3. grape动态PHP结构(一)——目录结构与配置文件

    一.结构介绍 结构的名字grape,中文名叫葡萄,因为最近一个同事经常带葡萄到公司给我们吃,受到启发想到了这个名字. 1)本结构需要在PHP5.5中运行,如果要在5.4中运行,有些地方就要做些修改 2 ...

  4. fzu 2171 防守阵地 II

    Problem 2171 防守阵地 II Accept: 31    Submit: 112Time Limit: 3000 mSec    Memory Limit : 32768 KB  Prob ...

  5. Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant

    Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant

  6. CJOJ 2171 火车站开饭店(树型动态规划)

    CJOJ 2171 火车站开饭店(树型动态规划) Description 政府邀请了你在火车站开饭店,但不允许同时在两个相连的火车站开.任意两个火车站有且只有一条路径,每个火车站最多有 50 个和它相 ...

  7. 【Rails App】 应用服务器从Passenger切换为Puma, Grape出现线程安全问题

    Grape中的代码如下: def market @market ||= Market.find(params[:id]) end @market基于类层次的实例变量,属于非线程安全,如果一直使用多线程 ...

  8. Chromium Embedded Framework (CEF)_3.2171.2069_v20170606_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 [增加了960x90% 和 1280x90%] 这次修改是主要针对 YY web 直播平台 ...

  9. Chromium Embedded Framework (CEF)_3.2171.1979_v20170602_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 这次修改是主要针对 YY web 直播平台 对录屏的朋友有很大帮组 CEF_3.2171.1 ...

随机推荐

  1. 微信小程序根据生日获取年龄

    // 根据出生日期计算年龄周岁 传参格式为1996-06-08 // 根据出生日期计算年龄周岁 传参格式为1996-06-08 function getAge(strBirthday) { var r ...

  2. Redis—简介与安装

    Redis 简介 Redis 安装 Redis 配置文件 # Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程.daemonize yes # 当Redis以守护进 ...

  3. java 反编译工具 jd-gui

    下载地址    http://java-decompiler.github.io/         一般使用windows 版本  看你使用的操作系统了 解压  点击exe 进入 选择你编译后的cla ...

  4. JVM-9-调优工具

    JDK的bin目录下有很多用于监视虚拟机和故障处理的工具,这些工具都非常稳定而且功能强大,能在处理应用程序性能问题.定位故障是发挥很大的作用.比较细心的读者可能会注意到这些工具的程序体积都异常小巧.并 ...

  5. RabbitMQ学习笔记(五、RabbitMQ集群)

    目录: RabbitMQ集群 镜像队列 RabbitMQ服务日志 RabbitMQ分布式部署 高可用集群 RabbitMQ集群: 1.集群中组件的状态 首先MQ一定要是一个高可用的中间件所以集群肯定是 ...

  6. python中copy()和deepcopy()详解

    **首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...

  7. 基于Node 的http转发demo,项目中请使用express+http-proxy-middleware

    var http = require("http"); var data = ''; function getData() { const options = { host: 'w ...

  8. Redis+Keepalived

    简介 Redis高可用方案,保障两台Redis任意节点故障可正常使用. 方案:Redis主从复制+Redis哨兵+Keepalived 环境 系统:Centos/Radhat 7 服务1:Redis ...

  9. SonarLint各种提示的意思

    1.Refactor this method to reduce its Cognitive Complexity from 29 to the 15 allowed. 2.Method has 15 ...

  10. 转Ubuntu 16.04 创建无线热点

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ac_dao_di/article/deta ...