牛客 26E 珂学送分2 (状压dp)
珂...珂...珂朵莉给你出了一道送分题:
给你一个长为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)的更多相关文章
- 牛客网 珂学送分( 期望DP )
题意 : 题目链接 分析 : 听队友说一般概率从前往后推.期望从后往前推......... #include<bits/stdc++.h> using namespace std; ; d ...
- codevs2800送外卖(floyd+状压dp)
2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东 ...
- loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd
LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...
- 牛客多校3 A-PACM Team(状压降维+路径背包)
PACM Team 链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144 ...
- 【wikioi】2800 送外卖(状压dp+floyd)
http://www.wikioi.com/problem/2800/ 本题状压莫名其妙的tle了,(按照hzwer大神打的喂,他1000多ms,我就2000ms了?) (14.8.7更,将getnu ...
- codevs 2800 送外卖(状压dp)
/* f[i][j] 表示走过的点构成i状态 且最后到达的点为j时的最优解 在那最后一个状态就是(1<<n+1)-1 每个点都到达 在由此回到0 */ #include<iostre ...
- 牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)
牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...
- 牛客比赛-状压dp
链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意 ...
- 牛客练习赛49 B 筱玛爱阅读 (状压DP,子集生成)
链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...
随机推荐
- jenkins创建工程
1.新建一个工程 2.添加工程名,点击创建一个自由分格的软件项目 3.配置源码管理 4.增加工程构建步骤,选中调用顶层maven目标
- CentOS6.8上Docker配置阿里云镜像加速器
1.打开网站https://dev.aliyun.com,点击管理中心,登录阿里云账号(没有的可以注册,也可以用淘宝等第三方账号登录). 2.点击镜像加速器,复制加速器地址 3.配置本机Docker运 ...
- 感知机与BP神经网络的简单应用
感知机与神经元 感知机(Perceptron)由两层神经元组成(输入层.输出层),输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic un ...
- 初中知识回顾tan,sin,cos关系
如果K=tan, sin 是X x=k/power(1+k*k,0.5) 开平方 cos是y y=1.0/power(1+k*k,0.5) 开平方 gisoracle总结 ============= ...
- linux调用库的方式
linux调用库的方式有三种:1.静态链接库2.动态链接库3.动态加载库 其中1,2都是在编程时直接调用,在链接时加参数-l进行链接,运行时自动调用第三种需要在编程时使用dlopen等函数来获取库里面 ...
- centos7 搭建FTP
通过yum安装vsftpd yum install -y vsftpd 修改vsftpd的配置文件 vim /etc/vsftpd/vsftpd.conf 修改配置文件如下: 1.不允许匿名访问 an ...
- PLSQL Developer配置OCI连接远程数据库
转: PLSQL Developer配置OCI连接远程数据库 当前环境: 本机系统:Win7 32位 PLSQL版本:9.06 数据库版本:10.2 32位 下面开始具体操作. 1.在Oracle官网 ...
- 09 Flutter底部Tab切换保持页面状态的几种方法
IndexedStack:保此所有页面的状态: AutomaticKeepAliveClientMixin:保此部分页面的状态: 修改的页面代码: 页面效果: Tabs.dart import 'pa ...
- NLP之ROUGE[笔记]
0 前言 [定义]ROUGE:recall-oriented understanding for gisting evaluation,面向召回的要点评估理解 召回率,recall rate;要点,g ...
- Flutter Widget框架概述
Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI. Widget描述了他们的视图在给定其当前配置和状态时应该看起来像什么.当w ...