神仙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. UVA - 11107 Life Forms (广义后缀自动机)

    题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出. 对这n个字符串建广义后缀自动机,建完后每个字符串在自动机上跑一遍,沿fail树向上更新所有子串结点的出现次数( ...

  2. LeetCode Judge Route Circle

    原题链接在这里:https://leetcode.com/problems/judge-route-circle/description/ 题目: Initially, there is a Robo ...

  3. string容器

    一.string特性 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的,string与char*都可以用来表示字符串. 说到string的 ...

  4. 忘记Oracle System和Sys密码的解决方法

    忘记Oracle System和Sys密码的方法 :Oracle提供两种验证方式,一种是OS验证,另一种密码文件验证方式,如果是第一种方式用以下方法修改密码: sqlplus /nolog; conn ...

  5. Linux下markdown编辑软件 — retext 支持实时预览,存为pdf、html、ODT等

    本文由Suzzz原创,发布于 http://www.cnblogs.com/Suzzz/p/4129368.html,转载请保留此声明 ReText是一个linux下的markdown和reStruc ...

  6. 洛谷 3803 【模板】多项式乘法(FFT)

    题目:https://www.luogu.org/problemnew/show/P3803 第一道FFT! https://www.cnblogs.com/zwfymqz/p/8244902.htm ...

  7. zabbix上的宏(macro)介绍

    宏:macro,预设的文本替换模式: 宏是一种抽象概念(Abstraction),它根据一些列预定义的规则替换一定的文本模式,而解释或编译器在遇到宏时会自动进行这一模式替换.类似地,zabbix基于宏 ...

  8. MySQL insert插入

    使用INSERT语句插入新数据 语法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (pression,...),…      INSERT [INTO ...

  9. Day3-Python基础3--函数参数及调用

    一.return返回值 return的两个作用: 1)需要用一个变量来接受程序结束后返回的结果 2)它是作为一个结束符,终止程序运行 def test(): print("我是return前 ...

  10. Python使用类

    #coding:utf8 from selenium import webdriverfrom time import sleep class urlpage(object): #创建浏览器对象 de ...