~~~题面~~~

题解:

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

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

  看的题解其实不是这道题,但是是这道题的加强版,因为那道题允许交换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 ;
}

51nod1254 最大子段和 V2 DP的更多相关文章

  1. [51nod1254]最大子段和 V2

    N个整数组成的序列a[1],a[2],a[3],-,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

  2. 51Nod1053 最大M子段和V2 二分+DP

    传送门 直接DP的话最多也只能做到\(O(nm)\),对于\(5\times 10^4\)的数据范围实在无能为力 夹克老爷提供的做法是贪心,思想大概是在调整的同时,合理构造每个选择对应的新状态,使得新 ...

  3. 51nod 1053 最大M子段和 V2

    N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和. 例如:-2 ...

  4. 51nod 1049 1049 最大子段和 (dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 令 dp[i]表示为以a[i]结尾的最大子段和,则  dp[i]= ...

  5. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  6. 最大子段和的DP算法设计及其效率测试

    表情包形象取自番剧<猫咪日常> 那我也整一个 曾几何时,笔者是个对算法这个概念漠不关心的人,由衷地感觉它就是一种和奥数一样华而不实的存在,即便不使用任何算法的思想我一样能写出能跑的程序 直 ...

  7. 51nod 1022 石子归并 V2 —— DP四边形不等式优化

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2  基准时间限制:1 秒 空间限 ...

  8. 【最大M子段和】dp + 滚动数组

    题目描述 给定 n 个数求这 n 个数划分成互不相交的 m 段的最大 m 子段和. 给出一段整数序列 A1,A2,A3,A4,...,Ax,...,An ,其中 1≤x≤n≤1,000,000, -3 ...

  9. 51nod1524 最大子段和V2

    题干 N个整数组成的序列a[1],a[2],a[3],-,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数 ...

随机推荐

  1. Git----将本地代码推送到远程仓库

    1.初始化本地 git init 2.添加文件 -A等于 -. 和-a的集合 git add -A 3.提交 git commit -m 'add' 4.关联到远程库 git remote add o ...

  2. Laravel -- 模型

    模型文件 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { / ...

  3. plsql 连接数据库无法解析指定的连接标识符

    之前用plsql连接的时候一直出问题,报无法解析指定的连接标识符,但是我加上ip地址就可以连接上. 我百度了很久,有说如下图选择oracle home的,有说清空admin目录下的所有文件, 但是都不 ...

  4. python学习之控制流2

    配置环境:python 3.6 python编辑器:pycharm 代码如下: #!/usr/bin/env python #-*- coding: utf-8 -*- # 控制流语句: # if语句 ...

  5. 官方yum源安装选择所需版本mysql数据库并初始化(yum默认安装的是最新版MySQL8.+)

    在官网是找不到5.x系列的域名源的,系统默认是安装的oracle数据库,在安装前需要删除默认的 以下教程来源于官网说明 先去官网下载yum源,地址 https://dev.mysql.com/down ...

  6. Ubuntu装完后要做的几件事

    Ubuntu装完后要做的几件事 改hosts 无论哪里,改hosts都是第一件事,没hosts咋google.没google咋活.在终端输入命令 sudo gedit /etc/hosts在# The ...

  7. QOS-CBQ概述

     QOS-CBQ概述 2018年7月7日    19:56 CBQ(基于类的对列)是一种基于QOS policy实现的拥塞管理技术. CBQ中包含一个LLQ(低延迟队列),用来支撑EF(快速转发)类业 ...

  8. 005---Python数据类型--字典

    字典 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px ...

  9. 使用 -命令行-给-python-安装whl文件,

    whl文件下载到哪个位置,命令行就切入到哪里: 我的在D盘目录下,所以命令行切进D盘(CD):方式如下: 列出<用户目录>下的目录(dir): 因为我安装了2个版本的python所以给py ...

  10. RedHat7.1 安装Oracle12102

    选型: 32位的内存是个瓶颈,已经是64位的时代了.使用64位的CentOS6 和 64位的Oracle 11g R2 在虚拟机器安装,采用hostonly方式设置网络 注意:能上网的网卡要设置一下I ...