神仙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 精英选拔的更多相关文章

  1. 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践

    1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...

  2. NYNU_省赛选拔题(10)

    题目描述 Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recog ...

  3. 10年微软MVP路(如何成为一个MVP?)

    搞微软技术的,大家或多或少都有听说过微软的"最有价值专家"(MVP), 从2006年到2015年连续10年ASP.NET/IIS MVP.当年很多一起搞微软技术的朋友都转搞其他非微 ...

  4. 西方教育骗局,终于明白精英和普通人的残酷差别!(该校流传着一个数字——4。即“4小时睡眠、4杯咖啡、GPA4.0”——要想获得满分为4分的成绩,每天只睡4个小时,困了就喝4大杯咖啡)

    2018-02-14 00:00英国/私立学校 你不知道的是:西方教育通过一个宽松的过程,偷偷完成了社会分层. 1 “中国学生真是太苦了!”我的同学李女士总是发出这样的感慨. 李女士是我中学同学,在一 ...

  5. 2015/10 中外合璧再现辉煌—CCFC2015技术峰会

    笔者有幸参加了CCFC技术峰会,现在发布照片几张.大家看一下. 2015年10月14日,CCFC 2015电子数据取证技术峰会于四川成都举办,有200余名一线取证技术人员及国内外各行业专家参会.此次峰 ...

  6. FZU 1894 志愿者选拔(单调队列)

    传送门 Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查. ...

  7. [总结]HNOI2015省队选拔

    // 此博文为迁移而来,写于2015年4月21日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vy9t.html 这次省 ...

  8. 【pyQuery分析论坛】精英乒乓论坛

    In [25]: t= h('table') In [26]: In [26]: t('.mainbox').text() Out[26]: u'\u72b6\u6001 \u4e3b\u9898 \ ...

  9. <转>“人脉投资”的10条建议

    谁都知道人脉很重要,所以有些人非常勤奋的“做人脉”,他们往往会这样做—— 积极的参与各类线下活动,逢人就换名片.加微信. 见到名人或者重要人物必合影,而且他们还会掏出手机来给你看. 逢年过节,给所有他 ...

随机推荐

  1. 网络编程基础--IO模型

    一 IO模型介绍: 背景 是 Linux环境下 的 network IO , Third Edition: The Sockets Networking ”,.2节“I/O Models ”,Stev ...

  2. THUWC2019 滚粗记

    因为真的滚粗了,所以咕咕咕 膜清华爷 OYJason

  3. UVA - 1601 The Morning after Halloween (BFS/双向BFS/A*)

    题目链接 挺有意思但是代码巨恶心的一道最短路搜索题. 因为图中的结点太多,应当首先考虑把隐式图转化成显式图,即对地图中可以相互连通的点之间连边,建立一个新图(由于每步不需要每个鬼都移动,所以每个点需要 ...

  4. 【java规则引擎】之规则引擎解释

    转载:http://www.open-open.com/lib/view/open1417528754230.html 现实生活中,规则无处不在.法律.法规和各种制度均是:对于企业级应用来说,在IT技 ...

  5. 流畅的python之序列

    python对开发者友好的根源在于:1.序列的泛型操作2.内置的元组和映身类型3.用缩进来架构的源码4.无需变量声明的强类型 序列数据共用的一套丰富的操作:迭代.切片.排序和拼接.内置序列类型:1.容 ...

  6. python3小例子:scrapy+mysql

    https://blog.csdn.net/u010151698/article/details/79371234

  7. laravel的批量插入

    在日常开发中,用到批量插入的操作还是挺多的.记得很早很早以前,我还是在循环中写sql插入,结果被项目经理按在地上摩擦.好吧,性能这东西,用不到的时候还好,万一性能成为瓶颈,那代码优化,数据库优化就首当 ...

  8. C# Application Excel TreeView

    三章 应用 20节客户表登陆 //动软--单表--Models --新建.net项目--简单三层管理--DBUtity--DbHelper.cs 21节客户表数据读取 增加 CEnterprise(企 ...

  9. C语言第二次实验作业

    PTA ================= 11-6 方阵循环右移 --------------- 本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0.1.....n-1列变换 ...

  10. [转载]linux内核中的HZ介绍

    时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <Linux/param.h>中定义或该文件包含的某个子平台相关文件中.作为通用 ...