~~~题面~~~

题解:

  表示今天做题一点都不顺。。。。

  这题也是看了题解思路然后自己想转移的。

  看的题解其实不是这道题,但是是这道题的加强版,因为那道题允许交换k对数。

  因为我们选出的是连续的一段,所以假设我们选了某一段,那么原序列将会被分为3段,我们设这3段分别是第0段,第1段和第2段,我们假设我们选出的区间是第1段。

  那么我们的目的就是要从第0段或第2段中选出一个数,从第1段中剔除一个数,使得1段中剩余数+选出数之和最大。  

  所以我们设f[i][j][k][l]表示DP到i位,已经选出了j个数,剔除了k个数, 当前在第l段的最大值。

  那么每次转移的时候就枚举一下当前的状态,如果当前在第0段or第2段,那么就考虑选出一个数or不选一个数。

  如果当前在第1段,那么就考虑剔除这个数or保留这个数。

  最后的答案就枚举一下最后一个数是属于哪一段,是否有交换(如果交换就是选出1个数,剔除1个数)。

  这里虽然强制交换,但和可以选择交换不交换是等效的。

  因为当n <= 2的时候,交换显然无意义。当n > 2的时候,属于1段的数的个数和不属于1段的数的个数中肯定有一个>= 2,那么交换一个段内部的数肯定是不会产生影响的,所以和不交换一样。

  因此选择不交换一定是合法的。

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 50100
#define LL long long int n;
int s[AC];
LL f[AC][][][];//DP到i位, 选出j个,剔除k个,当前在第l段的最大值。 inline int read()
{
int x = ;char c = getchar();bool z = false;
while(c > '' || c < '')
{
if(c == '-') z = true;
c = getchar();
}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
if(!z) return x;
else return -x;
} void pre()
{
n = read();
for(R i = ; i <= n; i ++) s[i] = read();
} LL Max(LL a, LL b, LL c)
{
if(a > b && a > c) return a;
else if(b > c) return b;
else return c;
} LL Max_(LL a, LL b, LL c, LL d)
{
if(a > b && a > c && a > d) return a;
else if(b > c && b > d) return b;
else if(c > d) return c;
else return d;
} void work()
{
for(R i = ; i <= n; i ++)
{
f[i][][][] = max(f[i - ][][][], f[i - ][][][] + s[i]);
f[i][][][] = max(f[i - ][][][], f[i - ][][][]) + s[i];
f[i][][][] = Max(f[i - ][][][], f[i - ][][][] + s[i], f[i - ][][][]);
f[i][][][] = max(f[i - ][][][], f[i - ][][][]) + s[i];
f[i][][][] = Max(f[i - ][][][] + s[i], f[i - ][][][], f[i - ][][][]);
f[i][][][] = max(f[i - ][][][], f[i - ][][][]);
f[i][][][] = Max_(f[i - ][][][], f[i - ][][][], f[i - ][][][] + s[i], f[i - ][][][] + s[i]);
f[i][][][] = max(f[i - ][][][], f[i - ][][][]);
}
printf("%lld\n", Max_(f[n][][][], f[n][][][], f[n][][][], f[n][][][]));
} int main()
{
freopen("in.in", "r", stdin);
pre();
work();
fclose(stdin);
return ;
}

最新文章

  1. 面试复习(C++)之快速排序
  2. ofo走出校园观察:市场定位导致产品错位?
  3. ios项目总结一:开发中常用的设计模式
  4. codevs1358 棋盘游戏
  5. JavaScript_1
  6. C++断言与静态断言
  7. 西门子PLC两线制,四线制
  8. RxJava漫谈-RxAndroid使用
  9. 【程序猿助手】Emacs,最强的编辑器,之间的不
  10. Echart图表相关配置项的设置
  11. 2—sat
  12. 《AutoCAD Civil 3D .NET二次开发》勘误2
  13. ES6基本使用
  14. 界面编程之QT的Socket通信20180730
  15. python-day53--前端js
  16. 修改oracle系统参数spfile导致数据库无法启动解决
  17. GRUB 启动 WIN PE 镜像(ISO)
  18. Java HashMap,LinkedHashMap,TreeMap
  19. c++11——move/forward
  20. handsontable-developer guide-load and save

热门文章

  1. U盘被分区后恢复方法
  2. JS 红包随机
  3. 一个 mr 作业跑的比较慢,如何来优化。
  4. 3. 进程间通信IPC
  5. windows 安装 .net core 环境
  6. PATA1034题解
  7. Ubuntu无法安装vim怎么办?(Ubuntu 出现apt-get: Package has no installation candidate问题)
  8. php-configure错误解决
  9. [网站公告]18:07-18:20阿里云SLB故障造成网站不能正常访问
  10. jenkins使用Role Strategy管理用户权限