Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)
题意:
给你一个包含 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(动态规划.递推)的更多相关文章
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (简单DP)
题目:https://codeforces.com/contest/1155/problem/D 题意:给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 思路: ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp
题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x 问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- 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 ...
- Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)
https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...
- Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
题意:博弈题面 给出一个数字序列 (>=11) 有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手 数字序列一定是奇 ...
- Educational Codeforces Round 63 (Rated for Div. 2) C. Alarm Clocks Everywhere gcd
题意:给出一个递增的时间序列a 给出另外一个序列b (都是整数) 以b中任选一个数字作为间隔 自己从1开始任选一个时间当成开始时间 输出选择的数字标号以及 开始时间 思路 直接求间隔的公共gc ...
- Educational Codeforces Round 63 (Rated for Div. 2)
传送门 A. Reverse a Substring 题意: 给你一串 s,让你判断能否通过反转区间[l,r]的元素,使得反转后的串的字典序小于 s: 如果能,输出 "YES",并 ...
- 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 ...
随机推荐
- 【土旦】vue项目中 使用 pako.js 解密 gzip加密字符串
前言 今天跟后台对接一个接口,接受到一个加密的值,说是通过gzip加密过的,然后就蒙蔽了, 赶紧上百度找了一下资料,通过一篇文章(原文在底部)发现有个js库可以解密,就下载轻松解密了 实现代码 pok ...
- IM多类型holder封装
如标题,这是一个在列表多类型视图时的一个简化封装方法,减少多余代码,提高复用性,更好迭代扩展,先看视图列表效果图 GitHub:https://github.com/1024477951/Fragme ...
- MyBatis学习---整合SpringMVC
[目录]
- 网站注册与登录使用 bcrypt与 passport 双重验证 解释
网站在登录前,需要进行注册收集用户基本信息,bcrypt 提供密码加密验证的方法,但是使用不正确,会给初学者带来各种问题. bcrypt 的安装: npm i bcrypt 经过测试,经常安装不成功, ...
- 安装可以查看PMM 源码的Go环境
1.基础介绍 最近在搭建PMM数据库监控系统,我们知道 Prometheus 是 PMM Server 的重要组件,*_exporter是PMM Client的主要组件. 归属组件 名称 作用 Ser ...
- SQLServer之删除用户定义的数据库角色
删除用户定义的数据库角色注意事项 无法从数据库删除拥有安全对象的角色. 若要删除拥有安全对象的数据库角色,必须首先转移这些安全对象的所有权,或从数据库删除它们. 无法从数据库删除拥有成员的角色. 若要 ...
- Surging微服务的注意事项
做个记录 1.Service的方法必须是异步方法 这个是同事发现的,非异步方法Swagger会用不了 2.仓储层不能用接口 这个是自己做的,根据同事的例子,本来好好的,想着在仓储层给加个接口,然后用接 ...
- 周一02.3运行python程序的两种方式
一.运行python程序的两种方式 方法一:交互式: 优点:输入一行代码立刻返回结果 缺点:无法永久保存代码 方法二: ...
- Conway生命游戏
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/9986679.html 作者:窗户 Q ...
- C#之委托与事件(转载)
委托 1. 委托是事件的基础,使用关键字delegate,通过委托与命名方法或匿名方法关联,可以实现委托的实例化.必须使用具有兼容返回类型和输入参数的方法或 lambda 表达式实例化委托. pri ...