jdoj 2171: Grape
jdoj 2171: Grape
题意
题目大意
一个农场的葡萄架上挂着n串葡萄,若取一个葡萄就会获得与其相应的美味值。对于连续的k串葡萄,最多取b串,最少取a串,
问能够获得的最大美味值为多少
数据范围
n<=10000,0<=a<=b<=k<=10
分析
考虑到在选到第i串葡萄时,影响到决策的只有i前面k串葡萄
f[i] [sta] 表示,考虑完第i串葡萄,后k串葡萄的状态为sta时的最大美味值
小技巧:
看看n的范围,再想想我们的状态表示,可得,
每次转移只需要前一个状态的信息,所以我们可以用i&1表示当前位置,那么(i+1)&1就是下一个位置为了方便,不妨将这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的更多相关文章
- grape动态PHP结构(三)——API接口
		
一.app视图与控制器
 - grape动态PHP结构(二)——管理后台
		
一.概述
 - grape动态PHP结构(一)——目录结构与配置文件
		
一.结构介绍 结构的名字grape,中文名叫葡萄,因为最近一个同事经常带葡萄到公司给我们吃,受到启发想到了这个名字. 1)本结构需要在PHP5.5中运行,如果要在5.4中运行,有些地方就要做些修改 2 ...
 - fzu 2171 防守阵地 II
		
Problem 2171 防守阵地 II Accept: 31 Submit: 112Time Limit: 3000 mSec Memory Limit : 32768 KB Prob ...
 - Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant
		
Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant
 - CJOJ 2171 火车站开饭店(树型动态规划)
		
CJOJ 2171 火车站开饭店(树型动态规划) Description 政府邀请了你在火车站开饭店,但不允许同时在两个相连的火车站开.任意两个火车站有且只有一条路径,每个火车站最多有 50 个和它相 ...
 - 【Rails App】 应用服务器从Passenger切换为Puma, Grape出现线程安全问题
		
Grape中的代码如下: def market @market ||= Market.find(params[:id]) end @market基于类层次的实例变量,属于非线程安全,如果一直使用多线程 ...
 - Chromium Embedded Framework (CEF)_3.2171.2069_v20170606_x86.tar.xz
		
CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 [增加了960x90% 和 1280x90%] 这次修改是主要针对 YY web 直播平台 ...
 - Chromium Embedded Framework (CEF)_3.2171.1979_v20170602_x86.tar.xz
		
CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 这次修改是主要针对 YY web 直播平台 对录屏的朋友有很大帮组 CEF_3.2171.1 ...
 
随机推荐
- Linux:源代码安装及脚本安装的使用
			
由于这两个安装方法比较少,就没有单独分开来写 源代码安装 源码安装的步骤 (1)对下载的码包进行解压 (2)进入解压目录执行 configure 命令做相关设置 (3)执行 make 进行编译 (4) ...
 - shiro授权、注解式开发
			
在ShiroUserMapper.xml中新增内容 <select id="getRolesByUserId" resultType="java.lang.Stri ...
 - C# 常用排序算法
			
文章引用地址:https://www.cnblogs.com/fengyeqingxiang/archive/2019/06/14/11021852.html C#所有经典排序算法汇总 1 2 3 ...
 - linux下编译时的默认库和头文件搜索路径
			
链接库路径 默认的链接库路径,定义在搜索/etc/ld.so.conf下的一些路径,其包含了一些重要的系统位置:LIBRARY_PATH, 但如果定义了LD_LIBRARY_PATH, 动态库的搜索路 ...
 - 分治 FFT
			
为啥要叫分治\(fft\)啊,又用不到\(fft--\) 给定长度为\(n-1\)的数组\(g[1],g[2],--,g[n-1]\),求\(f[1],f[2],--,f[n]\),其中 \[f[i] ...
 - Norm比较
			
目录 Introduction BN LN IN GN SN Conclusion Introduction 输入图像shape记为[N, C, H, W] Batch Norm是在batch上,对N ...
 - React: React的复合组件
			
一.介绍 不论Web界面是多么的复杂,它都是由一个个简单的组件组合起来实现的,既然会创建一个简单的组件,那么复杂的组件就有了下手的切入点了.现在来实现一个简单的复合组件.一个颜色面板,一共三部分组成. ...
 - 【TCP/IP网络编程】:02套接字类型与协议设置
			
本篇文章主要介绍创建套接字函数相关的3个输入参数的含义,它们最终确定了套接字通信所采用的协议.同时,也简单对比了TCP和UDP传输方式的区别. 什么是协议?协议是对话中使用的通信规则,而在计算机领域则 ...
 - ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis
			
ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...
 - python爬取 “得到” App 电子书信息
			
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 静觅 崔庆才 PS:如有需要Python学习资料的小伙伴可以加点击下 ...