珂...珂...珂朵莉给你出了一道送分题:

给你一个长为n的序列{vi},和一个数a,你可以从里面选出最多m个数

一个合法的选择的分数定义为选中的这些数的和加上额外规则的加分:

有b个额外的规则,第i个规则即为:

对于这个序列的所有长为a的连续子区间,如果这个子区间中对应的给出的xi个位置都被选中了,则这次选择的分数加上yi(yi可能为负数,这种情况下分数仍然要加上y)

直接暴力枚举子集, 复杂度是$O(3^n+nm2^n)$.

#include <iostream>
#include <memset.h>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std; const int N = 110, INF = 0xefefefef;
int n,m,a,b;
int v[N], f[1<<16], dp[2][55][1<<16], c[1<<16];
void chkmax(int &a, int b) {a<b?a=b:0;} int main() {
scanf("%d%d%d%d", &n, &m, &a, &b);
a = min(a, n);
REP(i,1,n) scanf("%d", v+i);
REP(i,1,b) {
int x, y, s = 0, t, mx = 0;
scanf("%d%d",&x,&y);
while (x--) {
scanf("%d", &t);
s ^= 1<<t-1;
}
f[s] += y;
}
memset(dp,INF,sizeof dp);
int mx = (1<<a)-1, cur = 0;
REP(i,0,mx) {
int &s = dp[cur][__builtin_popcount(i)][i] = 0;
for (int j=i; j; --j&=i) s += f[j];
REP(j,0,a-1) if (i>>j&1) s += v[j+1];
}
memset(c,0xef,sizeof c);
REP(i,2,n-a+1) {
cur ^= 1;
memset(dp[cur],INF,sizeof dp[cur]);
REP(j,0,m) REP(k,0,mx) if (dp[!cur][j][k]!=INF) {
int &r = dp[!cur][j][k];
int nxt = k>>1^1<<a-1;
if (c[nxt]==INF) {
c[nxt] = 0;
for (int x=nxt; x; --x&=nxt) c[nxt] += f[x];
}
chkmax(dp[cur][j+1][nxt],r+v[i+a-1]+c[nxt]);
nxt = k>>1;
if (c[nxt]==INF) {
c[nxt] = 0;
for (int x=nxt; x; --x&=nxt) c[nxt] += f[x];
}
chkmax(dp[cur][j][nxt],r+c[nxt]);
}
}
int ans = 0;
REP(i,0,m) REP(j,0,mx) chkmax(ans,dp[cur][i][j]);
printf("%d\n", ans);
}

牛客 26E 珂学送分2 (状压dp)的更多相关文章

  1. 牛客网 珂学送分( 期望DP )

    题意 : 题目链接 分析 : 听队友说一般概率从前往后推.期望从后往前推......... #include<bits/stdc++.h> using namespace std; ; d ...

  2. codevs2800送外卖(floyd+状压dp)

    2800 送外卖  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond     题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东 ...

  3. loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd

    LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...

  4. 牛客多校3 A-PACM Team(状压降维+路径背包)

    PACM Team 链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144 ...

  5. 【wikioi】2800 送外卖(状压dp+floyd)

    http://www.wikioi.com/problem/2800/ 本题状压莫名其妙的tle了,(按照hzwer大神打的喂,他1000多ms,我就2000ms了?) (14.8.7更,将getnu ...

  6. codevs 2800 送外卖(状压dp)

    /* f[i][j] 表示走过的点构成i状态 且最后到达的点为j时的最优解 在那最后一个状态就是(1<<n+1)-1 每个点都到达 在由此回到0 */ #include<iostre ...

  7. 牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)

    牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...

  8. 牛客比赛-状压dp

    链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意 ...

  9. 牛客练习赛49 B 筱玛爱阅读 (状压DP,子集生成)

    链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...

随机推荐

  1. 【原】Python基础-__init__

    #py中,有些名称前后都会加上俩个下划线,是有特殊含义的#在Py中,由这些名字组成的集合所包含的方法称为 “魔法方法”.如果在你的对象中#实现了这些方法的其中某一个,那这些方法会被py自动调用,几乎没 ...

  2. Maven的New中没有Servlet问题(IDEA)

    1.问题 第一次使用Maven骨架创建Web项目的时候,遇到了 New 里面没有 servlet 的问题. 2.原因 经过查询,是因为IDEA检测到项目中没有导入相关的 jar 包导致. 3.解决方法 ...

  3. 如何构建自己的docker镜像

    需求情况:springboot项目想要部署到docker里面,如何部署? 步骤如下: 1.将jar包上传linux服务器 /usr/local/dockerapp 目录,在jar包所在目录创建名为 D ...

  4. 如何卸载oracle11g

    方法/步骤   .关闭oracle所有的服务.可以在windows的服务管理器中关闭:   打开注册表:regedit 打开路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ...

  5. C++的精髓——代码复用、接口复用

    C++的精髓——代码复用.接口复用 在另一篇文章中提到C++三大特点的核心概括,也写在这里吧.封装:信息隐藏继承:代码复用多态:面向对象C++并不是面向对象,它包容多种编程思想,如面向过程,面向对象, ...

  6. OLAP、OLTP的介绍CBO/RBO

    OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...

  7. linux服务端导入oracle数据库.sql脚本

    一般情况下,后缀名为.sql或者为记事本类型的文本脚本可以通过打开后复制或者直接在客户端打开执行,但如果脚本比较大时(比如文件达到几百M以上), 普通文本工具和数据库客户端都无法打开,哪怕可以打开,也 ...

  8. mysql多实例搭建

    一)多实例安装 [root@mysqlmaster01 ~]# mkdir /data/mysql_data2[root@mysqlmaster01 ~]# mkdir /data/mysql_dat ...

  9. unittest快速装载目前下所有测试用例的方法

    import unittest from BeautifulReport import BeautifulReport #导入BeautifulReport if __name__ == '__mai ...

  10. Hadoop 部署之 ZooKeeper (二)

    目录 一.Zookeeper功能简介 二.ZooKeeper基本概念 1.集群角色 三.ZooKeeper 的安装 1.下载安装(在datanode节点安装) 2.配置ZooKeeper环境变量 3. ...