WOJ 10 精英选拔
神仙dp,膜Claris
题意:给一个长度为$n$的数列,求出不超过k次交换后的最大连续子区间和。
发现交换后的最优答案一定是这样的(0和2的长度可以为0)
0 ( 1 ) 2
答案是标号为1的区间和。
那么就相当于在原数列中下标在0或2的数字可以放入1中,而原来下标在1的数可以拿出来到0或2。
我们设$f_{i, 0/1/2, a, b}$表示现在到第$i$个数,现在划分到的集合已经属于$0/1/2$,其中$0/2$中的数有$a$个被放入1中,$1$中的数有$b$个放入了$0/2$中的最优答案,那么最后的答案$ans = max_{0 \leq i \leq k, 1\leq s \leq2}(f_{n, s, i, i})$
然后题解里面就出现了转移方程显然这六个字……
喂,转移方程不显然啊……
对于每一个数有保留在原集合和放入$1/(0,2)$中两种放法。
我们只关心有多少数被放入了1,因为这是最后的答案,那么i到i + 1应当可以直接转移,这中间还对应着集合的变化。
对于要放入1的数,应当使$a$转移到$a + 1$
对于从1中拿出来的数,应当使$b$转移到$b + 1$
具体还是参照代码实现吧(感觉还是和没说一样),时间复杂度$O(nk^{2})$,在$k$较小的时候有比较优秀的表现。
Code:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 1e4 + ;
const int M = ;
const ll inf = (ll) << ; int n, m, d[N];
ll f[N][][M][M]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} template <typename T>
inline void chkMax(T &x, T y) {
if(y > x) x = y;
} int main() {
// freopen("btsc6.in", "r", stdin); scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) scanf("%d", &d[i]);; for(int i = ; i <= n; i++)
for(int t = ; t < ; t++)
for(int a = ; a <= m; a++)
for(int b = ; b <= m; b++)
f[i][t][a][b] = -inf;
f[][][][] = 0LL; for(int i = ; i < n; i++)
for(int a = ; a <= m; a++) {
if(a < m) chkMax(f[i + ][][a + ][], f[i][][a][] + d[i + ]);
chkMax(f[i + ][][a][], f[i][][a][]);
if(m >= ) chkMax(f[i + ][][a][], f[i][][a][]);
chkMax(f[i + ][][a][], f[i][][a][] + d[i + ]);
}
for(int i = ; i < n; i++)
for(int a = ; a <= m; a++)
for(int b = ; b <= m; b++) {
if(b < m) chkMax(f[i + ][][a][b + ], f[i][][a][b]);
chkMax(f[i + ][][a][b], f[i][][a][b] + d[i + ]);
if(a < m) chkMax(f[i + ][][a + ][b], f[i][][a][b] + d[i + ]);
chkMax(f[i + ][][a][b], f[i][][a][b]);
}
for(int i = ; i < n; i++)
for(int a = ; a <= m; a++)
for(int b = a; b <= m; b++) {
if(a < m) chkMax(f[i + ][][a + ][b], f[i][][a][b] + d[i + ]);
chkMax(f[i + ][][a][b], f[i][][a][b]);
} ll ans = 0LL;
for(int i = ; i <= m; i++) {
chkMax(ans, f[n][][i][i]);
chkMax(ans, f[n][][i][i]);
}
printf("%lld\n", ans); return ;
}
WOJ 10 精英选拔的更多相关文章
- 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践
1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...
- NYNU_省赛选拔题(10)
题目描述 Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recog ...
- 10年微软MVP路(如何成为一个MVP?)
搞微软技术的,大家或多或少都有听说过微软的"最有价值专家"(MVP), 从2006年到2015年连续10年ASP.NET/IIS MVP.当年很多一起搞微软技术的朋友都转搞其他非微 ...
- 西方教育骗局,终于明白精英和普通人的残酷差别!(该校流传着一个数字——4。即“4小时睡眠、4杯咖啡、GPA4.0”——要想获得满分为4分的成绩,每天只睡4个小时,困了就喝4大杯咖啡)
2018-02-14 00:00英国/私立学校 你不知道的是:西方教育通过一个宽松的过程,偷偷完成了社会分层. 1 “中国学生真是太苦了!”我的同学李女士总是发出这样的感慨. 李女士是我中学同学,在一 ...
- 2015/10 中外合璧再现辉煌—CCFC2015技术峰会
笔者有幸参加了CCFC技术峰会,现在发布照片几张.大家看一下. 2015年10月14日,CCFC 2015电子数据取证技术峰会于四川成都举办,有200余名一线取证技术人员及国内外各行业专家参会.此次峰 ...
- FZU 1894 志愿者选拔(单调队列)
传送门 Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查. ...
- [总结]HNOI2015省队选拔
// 此博文为迁移而来,写于2015年4月21日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vy9t.html 这次省 ...
- 【pyQuery分析论坛】精英乒乓论坛
In [25]: t= h('table') In [26]: In [26]: t('.mainbox').text() Out[26]: u'\u72b6\u6001 \u4e3b\u9898 \ ...
- <转>“人脉投资”的10条建议
谁都知道人脉很重要,所以有些人非常勤奋的“做人脉”,他们往往会这样做—— 积极的参与各类线下活动,逢人就换名片.加微信. 见到名人或者重要人物必合影,而且他们还会掏出手机来给你看. 逢年过节,给所有他 ...
随机推荐
- (转)轻量级C语言实现的minixml解析库入门教程
svn上的minixml源码下载:svn co http://svn.msweet.org/mxml/tags/release-2.7/ 按照下载回来的源代码进行编译和安装.本教程只针对新手做一个引导 ...
- 3.16 draw 3.17 更新函数
3.16 draw virtual void draw(); void HelloWorld::draw() { CCSize size = CCDirector::sharedDirector()- ...
- Django之用户认证系统分析
Django自带一个用户认证系统,这个系统处理用户账户.组.权限和基于cookie的会话,下面将通过分析django源码的方式仔对该系统进行详细分析 1. 用户模型 在django.contrib.a ...
- h5废弃的标签和属性及新增的标签和属性
一.废弃的标签和属性 1.表现性元素 a) basefont b) big c) center d) font e) strike f) tt 2.框架类元素 a) frame b) frameset ...
- Tomcat设计模式分析(转) 2
Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tom ...
- Python List reverse()方法
reverse() 函数用于反向列表中元素,参数 NA,该方法没有返回值,但是会对列表的元素进行反向排序,原来的列表被改变,生成新的列表. 例子:list1 = ['Google', 'Runoob' ...
- keepalived 检测脑裂切换脚本
#!/bin/bash count=0 run1=`curl -I 192.168.30.12:8000 | grep "200 OK" | wc -l` run2=`curl - ...
- flask之python3 虚拟环境及使用dotnv来永久保存环境变量
Python 3 comes bundled with the venv module to create virtual environments Create an environment Cre ...
- flask之Jinja2
Jinja2 is a library found at http://jinja.pocoo.org/; you can use it to produce formatted text with ...
- composer的安装和使用
由于工作中需要用到leancloud的LeanCloud PHP SDK,支持composer安装,所以就下载composer工具了, 安装之前可以用composer命令检测是否已经安装了,命令是:c ...