传送门

题意:

  给你一个包含 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. 基于mapnik做切片服务器的几点总结

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在地图服务器的整体方案中,移动端采用矢量切片,样式解析采用th ...

  2. 用存储过程向数据库添加大量数据【mysql】

    预分配ID的设计,需要先为数据库生成大量的数据.比如对用户ID有要求的系统,那么用户ID就要预先生成. 通过python,php,c/c++/c#,js等程序生成也是可以,但需要这些程序环境,而且单条 ...

  3. The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##' credential exists and contains valid information.

    In one of our recent migrations, we got the following error when the client tried to fire xp_cmdshel ...

  4. Swift中 删除Array的元素对象

    Swift中Array的删除对象 在Swift中数组Array没有removeObject的方法 1.找到下标 let model_index = selectedArray.index(where: ...

  5. VS2017 community版使用码云(gitee)的一些过程,看图学习,傻瓜式教程

    首先你得有一个gitee账号,VS2017IDE开发工具 第一步,打开VS2017,点击菜单栏上->工具->扩展与更新,如图 然后点击 联机 然后输入 gitee 回车搜索 一定要选择我圈 ...

  6. 自定义react数据验证组件

    我们在做前端表单提交时,经常会遇到要对表单中的数据进行校验的问题.如果用户提交的数据不合法,例如格式不正确.非数字类型.超过最大长度.是否必填项.最大值和最小值等等,我们需要在相应的地方给出提示信息. ...

  7. Ubuntu 18.04中截图工具Shutter的编辑按钮不可用的解决办法

    Shutter是一个由第三方提供的在Ubuntu上运行的截图工具,相对于系统自带的截图工具(默认可通过Ctrl + Shift + Print快捷键启动截图),最大的优点就是可以即时对图片进行编辑,在 ...

  8. 逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)

    1.首先先定义进行卷积的参数: 输入特征图为高宽一样的Hin*Hin大小的x 卷积核大小kernel_size 步长stride padding填充数(填充0) 输出特征图为Hout*Hout大小的y ...

  9. 从jsp到java文件再返回到前台页面的过程

    客户端请求jsp页面总共分为三个阶段: <%@ page language="java" contentType="text/html; charset=utf-8 ...

  10. form单选框

    form中的单选框: var resultStartRadio = new Ext.form.RadioGroup({ id : 'resultStartRadio', name :"for ...