牛客练习赛18E pocky游戏 状压dp
正解:状压dp+辅助dp
解题报告:
来还债辣!NOIp之后还是轻松很多了呢,可以一点点儿落实之前欠下的各种东西一点点提升自己!加油鸭!
是个好题,可以积累套路,启发性强,而且很难
哦而且状压它也是个好东西鸭,这次D2T2好像8以内的部分分就是用神仙状压做的呢,当然我是不会的只会傻逼地推数论QAQ还是可以落实学习一下那题的神仙状压部分分呢QAQ
ummm那这题因为最开始是没太懂的 所以和之前做疫情控制一样分几个板块慢慢梳理趴qwq
首先要确定这题用什么方法?
不要说是已经看到题解说用状压dp辣!
正儿八经说,如果没有题解,怎么思考这道题
关键点大概是在n<=20这个事儿,看到20应该就要敏感了,这个就很,状压dp是趴
好滴积累套路一:20这个范围很有可能是状压dp可以往上面想下
然后确定方法之后就一步步思考,先把题目描述给一点点扣了
首先碰到第一坑点:绝对值
这一个又是一个,典型套路!就是,如果我们按部就班地一点点考虑,我们完全没有办法搞绝对值这个小妖精
但是如果它不是绝对值,就单纯的+-还是有点可做性的感觉的?那我们就可以考虑去除绝对值
想到去除绝对值大概就会有点感觉了——按照大小顺序确定!不就可以直接解决绝对值了嘛!
好滴那套路二来啦:如果碰到绝对值的问题可以考虑从小到大or从大到小考虑然后就可以直接把绝对值删了
那我们现在就相当于是,从小到大考虑每个数在pi中的位置,然后再一点点做
恩然后按照状压dp的套路我们就可以得到肯定是设fi表示状态i的minans咯,考虑怎么转移
先考虑每确定pi中的一个数会有什么贡献
显然对于长度为m的那个序列中的每个数它只会对它左右的数造成贡献
然后我们可以预处理出来贡献的
大概说下预处理贡献趴毕竟你太蠢估计再看一遍又要理解半天呢QAQ
大概就是,我们读入一个数处理完它之后就存给last,然后读入它的下一个数now,这样我们计算贡献就++glast2now ++gnow2last (关于g的意义可能在这里还是会感觉比较难懂?可以往下翻呢后面又讲述了遍qwq
这样全部读完的时候我们就已经预处理出gij表示只确定了pj位然后这时候我们确定pi位的时候pi的系数是多少
但这当然不够我们肯定是要各种确定状况下确定pi位的贡献是趴,然后就读完之后再再再处理下嘛,就和dp差不多的转一下,就枚举状态j然后gij=gij-lowbitj+gilowbitj转移来就好辣,这样就能预处理出任意一个状态i时确定第j个数的系数是多少
昂预处理贡献港完就差不多把描述扣完辣,总算可以进入正式dp转移了 转移完就做完辣!激不激动!
总算进入正题的dp
就大力转移啊,枚举处理到p数列的i这个状态了然后一一枚举新加入的最大的数放在这个状态中确定了的位置j上
然后就转移是fi可以从(f没有确定j+确定j的贡献)转移来,当然也可以不转,就是如果把最大的数放在另一个位置上,我们发现,欸,更好,那我们就不用放这儿了嘛又不是傻逼
然后最后一个难点!确定j的贡献怎么计算
你意思意思理解下得了x
就是首先我们要知道新加入的这个最大的数它是第几大的,这个很好求吼,我们先当做我们知道了,它是第cjk大的然后它的值是data[cjk](。。。懒得想变量名了凑合着用就这样趴qwq)然后那就是我们预处理出的gji-gj2n-i)*(data[cjk]
关于g再解释下趴还是比较难理解的呢QAQ
就是我们现在相当于是说搞出状态j时插入i的系数,这个就是它的正系数,它在这里面都是被减数,相当于是加的
然后后面那个表示我现在已经确定了状态i,那它的补集就是2n-i对趴,这个补集就是还没有确定的数,这些数就都是比data[cjk]大的了,那就所有在data[cjk]旁边的数都会-它,它就成了减数了
我们就把它作为被减数时的系数-它作为减数时的系数就是它的实际系数了然后乘以它的data就是它的贡献了呢
明白了嘛!
哇我真滴觉得!!!太太太妙了!怎么这么妙呢!
over!
(还是忍不住再说句,真滴好妙啊!!!天呐!!!
牛客练习赛18E pocky游戏 状压dp的更多相关文章
- NowCoder110E Pocky游戏 状压DP
传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...
- CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
三角形棋盘上的博弈游戏 题目连接: http://mozhu.today/#/problem/show/1402 Description 柱爷有天上课无聊,于是和同桌卿学姐一起下一种奇特的棋: 棋盘如 ...
- 牛客练习赛24题解(搜索,DP)
A题,C题不讲,基础题(但是我要抨击一下这次比赛,卡cin,cout,卡的太狠了,根本就不让过的那种,QAQ) 链接:https://www.nowcoder.com/acm/contest/157/ ...
- 出题人的手环(牛客练习赛38D 离散化+树状数组)
题目链接(https://ac.nowcoder.com/acm/contest/358/D) 题目描述 出题人的妹子送了出题人一个手环,这个手环上有 n 个珠子,每个珠子上有一个数. 有一天,出题人 ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m<=15,直接搞肯定不行,考虑一行一行来, 每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑 最后一行必须要同时满足他自己和他上面那行,否则舍去 #inc ...
- 牛客练习赛 26 B题 烟花【DP】(经典)
<题目链接> 题目描述 小a有个烟花,每个烟花代表着互不相同的颜色,对于第个烟花,它有的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生种颜色的概率 输入描述: ...
- JZYZOJ1384 种花小游戏 状压dp
http://172.20.6.3/Problem_Show.asp?id=1384 最开始以为是dfs然后超时了,然后调了半天调成dp,还不如再写一遍... 代码 #include<iost ...
- 牛客练习赛32B Xor Path (树形dp)
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 给定一棵n个点的树,每个点有权值.定义表示 ...
- 牛客练习赛79E-小G的数学难题【dp,单调队列】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出\(n\)个三元组\((a_i,b_i,c_i)\). 要求选出一个集合\(S\) ...
随机推荐
- Python内置性能分析模块timeit
timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', timer=<tim ...
- 在MyEclipse(2015)中上传项目到github的步骤(很详细)
(图文)在MyEclipse(2015)中上传项目到github的步骤(很详细) git|smartGit使用详解 SmartGit使用教程
- ANDROID – TOOLBAR STEP BY STEP(转)
今年(2014) 的 Google I/O 發表令多數人為之一亮的 Material Design,而 Google 也從「Google I/O 2014」 開始,大家也陸陸續續地看到其更新的 And ...
- DELPHIER,正转向PYTHON了
用了10多年的DELPHI ,现在准备学PYTHON了, 理由是: 1)现在是云计算时代了,需要学习一门适应该时代的语言,研究了很久,PYTHON是最佳选择,排除了PHP,PERL,RUBY等,至于G ...
- 【大数据系列】hadoop2.0中的jobtracker和tasktracker哪里去了
低版本的hadoop下MapReduce处理流程 1.首先用户程序(JobClient)提交了一个job,job的信息会发送到Job Tracker,Job Tracker是Map-reduce框架的 ...
- 【大数据系列】HDFS文件权限和安全模式、安装
HDFS文件权限 1.与linux文件权限类型 r:read w:write x:execute权限x对于文件忽略,对于文件夹表示是否允许访问其内容 2.如果linux系统用户sanglp使用hado ...
- jQuery事件处理(四)
看了几天,决定整理一下jQuery事件处理的整体设计思路 1.通过add方法给选中的元素注册事件处理程序(通过缓存系统将事件储存到cache,而不是绑定到元素上) a.在存储之前,会为事件处理程序增加 ...
- Android 编译时:m、mm、mmm、mma、mmma的区别
m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Andr ...
- Linux下重启mysql的时候出现 start: Job failed to start
mysql进程自己退出了,使用如下指令确认mysql进程不在了. ps -ef | grep mysql 看不到mysql进程 mysql进程不在,尽快回复服务的想法,就是重启服务 /etc/init ...
- calloc(), malloc(), realloc(), free(),alloca()
内存区域可以分为栈.堆.静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. 利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提 ...