链接:https://ac.nowcoder.com/acm/contest/26/E
来源:牛客网

题目描述

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

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

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

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

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

输入描述:

第一行四个数n,m,a,b

之后一行n个数表示序列v

之后表示b个规则

每个规则先输入两个数xi和yi

之后一行xi个数,分别表示这给定的xi个位置

输出描述:

一行一个数表示最大可能得到的分数
示例1

输入

复制

5 3 3 1
2 3 3 3 3
2 233
1 3

输出

复制

474

说明

示例2

输入

复制

5 3 3 1
111 222 333 444 555
2 52
1 3

输出

复制

1384

说明

备注:

对于100%的数据,0 <= n <= 100 , 0 <= m <= 50 ,0<= a <= 16 , 0 <= b <= 100000, 所有出现的数的绝对值<=600

解题思路:首先预处理出每个状态下能得到的额外的分数,定义状态dp【i】【j】【k】为前i个数中取j个数,最后a个数的状态为k时的最大分数,那么状态转移方程为:取当第i+1个数字时:dp[1^flag][j+1][(k>>1)|(1<<(a-1))]=max(dp[1^flag][j+1][(k>>1)|(1<<(a-1))],dp[flag][j][k]+eval[(k>>1)|(1<<(a-1))]+val[i]);不取第i+1个数字:dp[1^flag][j][k>>1]=max(dp[1^flag][j][k>>1],dp[flag][j][k]+eval[k>>1]);这里我用了滚动数组。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int eval[1<<16];
int val[105];
int dp[2][55][1<<16];
int main(){int n,m,a,b;scanf("%d%d%d%d",&n,&m,&a,&b);for(int i=0;i<n;i++){scanf("%d",&val[i]);}for(int i=0;i<b;i++){int x,y;int tem=0;int tet;scanf("%d%d",&x,&y);while(x--){scanf("%d",&tet);tet--;tem=tem|(1<<tet);}eval[tem]+=y;//    cout<<tem<<endl;
    } for(int i=(1<<a)-1;i>=0;i--){if(eval[i]!=0){int j=(1<<a)-1-i;for(int s=j;s>0;s=(s-1)&j)eval[i|s]+=eval[i];}}for(int i=0;i<=m;i++){for(int j=0;j<(1<<a);j++){dp[0][i][j]=-inf;}}for(int j=0;j<(1<<a);j++){int tem=0;int cnt=0;for(int k=0;k<a;k++){if(j&(1<<(k))){tem+=val[k];cnt++;}}dp[0][cnt][j]=max(dp[0][cnt][j],tem+eval[j]);}int flag=0;for(int i=a;i<n;i++){for(int j=0;j<=m;j++){for(int k=0;k<(1<<a);k++){dp[1^flag][j][k]=-inf;}}for(int j=0;j<=m;j++){for(int k=0;k<(1<<a);k++){//    int sta=k;if(dp[flag][j][k]==-inf)continue;int tem=(k>>1)|(1<<(a-1));dp[1^flag][j][k>>1]=max(dp[1^flag][j][k>>1],dp[flag][j][k]+eval[k>>1]);dp[1^flag][j+1][tem]=max(dp[1^flag][j+1][tem],dp[flag][j][k]+eval[tem]+val[i]);}}flag=flag^1;}int ans=-inf;for(int i=0;i<=m;i++){for(int j=0;j<(1<<a);j++){ans=max(ans,dp[flag][i][j]);}}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Zhi-71/p/11503875.html

牛客练习赛6 珂学送分2相关推荐

  1. 牛客每日练习----珂学送分,捡石头,良神爱购物

    大提琴的声音就像一条河,左岸是我无法忘却的回忆,右岸是我值得紧握的璀璨年华,中间流淌的,是我年年岁岁淡淡的感伤 链接:https://ac.nowcoder.com/acm/problem/14378 ...

  2. 牛客 26E 珂学送分2 (状压dp)

    珂...珂...珂朵莉给你出了一道送分题: 给你一个长为n的序列{vi},和一个数a,你可以从里面选出最多m个数 一个合法的选择的分数定义为选中的这些数的和加上额外规则的加分: 有b个额外的规则,第i ...

  3. Wannafly挑战赛3 珂学送分(期望dp)

    科学送分 定义dp[i]dp[i]dp[i]为[i,n]分段的期望[i,n]分段的期望[i,n]分段的期望 那么dp[n]=1dp[n]=1dp[n]=1 对于确定的i,设我们找到了最大的j满足∑k= ...

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

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

  5. 期望DP——珂学送分

    题解: dp[i]dp[i]dp[i]代表[i-n]这个区间分成多少段的期望值 我们从后面往前面扫描,当我们发现i−ji-ji−j这个范围是满足的话,那么我们可以切分的点就存在j−i+1j-i+1j− ...

  6. Wanafly 挑战赛3 A 珂学送分 (dp)

    解题思路 从后往前考虑,令dp[i] 为从i-n这段区间可以切成的期望段数,从后往前就比较好转移了. dp[i]=1j−i+1∑k=i+1j+1dp[k]+1 dp[i] = \frac{1}{j-i ...

  7. 牛客练习赛54(A,B,C(ATCG相同的分在一起 暴力加巧妙差分))

    牛客练习赛54 日常刷一套牛客练习赛题 A-乘积 n这么小 暴力即可,不知道unsinged long long 操作,用java大数写了: import java.math.BigInteger; ...

  8. 牛客练习赛76 F-phi and phi 莫比乌斯反演+差分

    牛客练习赛76 F-phi and phi 莫比乌斯反演+差分 题意 思路 Code(445MS) 传送门: https://ac.nowcoder.com/acm/contest/10845/F 题 ...

  9. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

最新文章

  1. JS的document.all函数使用 示例
  2. mysql cluster 数据文件_mysql-【求救】关于MYSQL CLUSTER数据文件存放节点错误问题
  3. northwind中文 for mysql_学习心得 | PHP与mysql通信的若干问题
  4. python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理
  5. ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
  6. 中国剩余定理证明过程
  7. java 进制转换算法_算法笔记_033:十六进制转八进制(Java)
  8. 虚拟机安装mac os x实战
  9. 【洛谷】【堆+贪心】P1484 种树
  10. 谈谈linux内核原理,谈谈Linux内核驱动的coding style
  11. Oracle grant connect, resource to user语句中的权限
  12. Atiitt 图像处理的常见功能业务用途与类库与功能实现 目录 1. 常见业务场景 2 1.1. 缩略图 2 1.2. 判断图像大小分辨率要求 长度 宽度 2 1.3. 图像格式 转换,,黑白图像
  13. eclipse汉化(傻瓜式)
  14. MagicDraw-BDD图
  15. 秩和检验的概念及python实现
  16. 局域网共享文件搭建方法
  17. 回顾2017展望2018
  18. JQ实现谷歌小恐龙小游戏
  19. 计算机中级改进的具体措施,改进职高计算机教学的几点措施
  20. 2.4G功放芯片,支持国产

热门文章

  1. 基于thinkjs 3.x 转发下载图片 示例
  2. 1] python 爬取微信好友个性签名,生成词云
  3. Git入门到精通(大全)
  4. 转贴:华为加班死人了
  5. python爬虫:批量抓取代理ip,进行验证,抓取豆瓣网站影视信息
  6. 要求树根像果实一样作贡献,就只好把它做柴烧了
  7. 音频采样及编解码——LPCM 、ADPCM、G711、G726
  8. [ctf misc][wp]一些内存取证的wp(含[2021蓝帽杯北部赛区分区赛]博人的文件)
  9. 探究InnoDB数据页内部行的存储方式
  10. php茶餐厅销售管理系统的设计与实现