传送门

题意:

  给你一个包含 n 个元素的序列 a[];

  定义序列 a[] 的 beauty 为序列 a[] 的连续区间的加和最大值,如果全为负数,则 beauty = 0;

  例如:

  a[] = {10, -5, 10, -4, 1} ;

  beauty = 15;( 10+(-5)+10 )

  a[] = {-3, -5, -1};

  beauty = 0;( 不取 )

  给你一个整数 x,你可以将序列 a[] 的任意子序列 a[ l , r ]*x(即 a[l]=a[l]*x,a[l+1]=a[l+1]*x,.....,a[r]=a[r]*x);

  当然,也可以不执行这个操作;

  求 beauty 的最大值;

思路:

  一看到这道题,第一反应就贪过去了;

  贪了好大一会,交了几发程序,全部 "Wrong answer on test 5";

  看了一眼他人的AC代码,看到了 dp 数组,然后,想了好久好久的动态规划解法;

  wa 了改,改了 wa,终于,在下午临近吃饭的时候,AC了(大佬轻点虐)

  

  假设修改的区间为[ L,R ]

  那么,对于∀i∈[1,n], i = L or L < i < R or i = R;

  定义 dp[ i ][ j ],含义如下:

  j = 0 : i 作为修改区间的起始位置,从 i 开始向左能形成的最大区间和;

  j = 1 : i 作为修改区间的中间位置,从 i 开始向左能形成的最大区间和;

  j = 2 : i 作为修改区间的终点位置,i 可以形成的最大区间和;

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INFll 0x3f3f3f3f3f3f3f3f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=3e5+; int n,x;
ll a[maxn];
/**
在做*x的操作下
dp[i][0]:i位置为修改区间的开始
dp[i][1]:i位置为修改区间的中间部分
dp[i][2]:i位置为修改区间的结尾
*/
ll dp[maxn][];
/**
在不做*x的操作下
maxL[i]:以i开始的向左能形成的最大的区间和
maxR[i]:以i开始的向右能形成的最大的区间和
*/
ll maxL[maxn];
ll maxR[maxn]; ll Solve()
{
maxL[]=-INFll;
for(int i=;i <= n;++i)
maxL[i]=max(maxL[i-]+a[i],a[i]);
maxR[n+]=-INFll;
for(int i=n;i >= ;--i)
maxR[i]=max(maxR[i+]+a[i],a[i]); dp[][]=dp[][]=;
for(int i=;i <= n;++i)
{
dp[i][]=x*a[i]+(maxL[i-] > ? maxL[i-]:);
dp[i][]=max(dp[i-][],dp[i-][])+x*a[i];
dp[i][]=max(dp[i][],dp[i][])+(maxR[i+] > ? maxR[i+]:);
} ll ans=;
for(int i=;i <= n;++i)
ans=max(max(ans,maxL[i]),dp[i][]); return ans;
}
int main()
{
while(~scanf("%d%d",&n,&x))
{
for(int i=;i <= n;++i)
scanf("%lld",a+i);
printf("%I64d\n",Solve());
}
}

巨巨代码(额外增加点我的注释)

 #include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long int n,x;
ll a[];
ll dp[][]; int main()
{
ll ans=;
cin>>n>>x;
for(int i=;i<=n;++i)
cin>>a[i]; mem(dp[],);
/**
dp[i][0]:[1,i]未使用*x所形成的最大区间和
dp[i][1]:[L,i-1]使用*x,并且i也使用*x所形成的最大区间和
dp[i][2]:[L,i-1]使用*x,但是i不使用*x所形成的最大区间和
*/
for(int i=;i<=n;++i)
{
dp[i][]=a[i]+(dp[i-][] > ? dp[i-][]:);
dp[i][]=max(0LL,max(dp[i-][],dp[i-][]))+a[i]*x;
dp[i][]=max(0LL,max(dp[i-][],dp[i-][]))+a[i];
for(int j=;j<;++j)//三者去最值
ans=max(ans,dp[i][j]);
}
cout<<ans<<endl; return ;
}

Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)的更多相关文章

  1. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (简单DP)

    题目:https://codeforces.com/contest/1155/problem/D 题意:给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 思路: ...

  2. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

  3. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  4. Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元

    https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...

  5. Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)

    https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...

  6. Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维

    题意:博弈题面  给出一个数字序列 (>=11)  有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手  数字序列一定是奇 ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) C. Alarm Clocks Everywhere gcd

    题意:给出一个递增的时间序列a  给出另外一个序列b  (都是整数) 以b中任选一个数字作为间隔  自己从1开始任选一个时间当成开始时间 输出选择的数字标号以及 开始时间 思路  直接求间隔的公共gc ...

  8. Educational Codeforces Round 63 (Rated for Div. 2)

    传送门 A. Reverse a Substring 题意: 给你一串 s,让你判断能否通过反转区间[l,r]的元素,使得反转后的串的字典序小于 s: 如果能,输出 "YES",并 ...

  9. Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph 【规律 && DFS】

    传送门:http://codeforces.com/contest/1093/problem/D D. Beautiful Graph time limit per test 2 seconds me ...

随机推荐

  1. Git安装教程(windows)

    Git是当今最流行的版本控制软件,它包含了许多高级工具,这里小编就讲一下Git的安装. 下载地址:https://git-scm.com/downloads 首先如下图:(点击next) 第二步:文件 ...

  2. java 线程方法 ---- wait()

    class MyThread5 implements Runnable{ private int flag = 10; @Override public void run() { while (fla ...

  3. 魅族5.0以上设备(亲测有效)激活Xposed框架的流程

    对于喜欢研究手机的哥们来说,大多时候会使用到Xposed框架及种种功能强大的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活Xposed框架是比较简单的,但随着系统版本的持续更新 ...

  4. d3.svg.line()错误:TypeError: d3.svg.line is not a function

    var line_generator= d3.svg.line() .x(function (d,i) { return i; }) .y(function (d) { return d; }) 错误 ...

  5. vmware 14 新安装centos7 没法联网

    vmware14 刚安装好centos7后,想下载安装一些软件发现无法联网,于是就百度了一下.下面 记录下解决方法. 1 确报主机能上网. 2 设置虚拟机网络适配器 3 设置虚拟机网卡 4 修改cen ...

  6. bilibili用户信息全栈爬取

  7. 数据库【redis】基本命令

    redis常用命令大全   1.基于内存的key-value数据库 2.基于c语言编写的,可以支持多种语言的api //set每秒11万次,取get 81000次 3.支持数据持久化 4.value可 ...

  8. Nmon实时监控并生成HTML监控报告

    前面的博客介绍了服务端监控工具:Nmon使用方法,最近在github找到了一个nmon自动监控并生成HTML格式报告的工具:easyNmon,使用体验蛮不错的,这里介绍下它的安装及使用方法. 一.关于 ...

  9. 揽货最短路径解决方案算法 - V2(增加了时间维度-客户允许的服务时间段,C#/JAVA同步实现,带python作图)

    继上篇,这里改进增加了客户允许服务的时间范围这个维度,并且把C#版本翻译成java,加强了更加形象的图表展示路径(继续是用python的matplotlib作图). 这里的时间范围维度是指:每个客户都 ...

  10. 证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP)

    离散对数问题,英文是Discrete logarithm Problem,有时候简写为Discrete log,该问题是十几个开放数学问题(Open Problems in Mathematics, ...