传送门

题意:

  给你一个包含 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 可以形成的最大区间和;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define INFll 0x3f3f3f3f3f3f3f3f
 6 #define ll long long
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 const int maxn=3e5+50;
 9
10 int n,x;
11 ll a[maxn];
12 /**
13     在做*x的操作下
14     dp[i][0]:i位置为修改区间的开始
15     dp[i][1]:i位置为修改区间的中间部分
16     dp[i][2]:i位置为修改区间的结尾
17 */
18 ll dp[maxn][3];
19 /**
20     在不做*x的操作下
21     maxL[i]:以i开始的向左能形成的最大的区间和
22     maxR[i]:以i开始的向右能形成的最大的区间和
23 */
24 ll maxL[maxn];
25 ll maxR[maxn];
26
27 ll Solve()
28 {
29     maxL[0]=-INFll;
30     for(int i=1;i <= n;++i)
31         maxL[i]=max(maxL[i-1]+a[i],a[i]);
32     maxR[n+1]=-INFll;
33     for(int i=n;i >= 1;--i)
34         maxR[i]=max(maxR[i+1]+a[i],a[i]);
35
36     dp[0][0]=dp[0][1]=0;
37     for(int i=1;i <= n;++i)
38     {
39         dp[i][0]=x*a[i]+(maxL[i-1] > 0 ? maxL[i-1]:0);
40         dp[i][1]=max(dp[i-1][0],dp[i-1][1])+x*a[i];
41         dp[i][2]=max(dp[i][0],dp[i][1])+(maxR[i+1] > 0 ? maxR[i+1]:0);
42     }
43
44     ll ans=0;
45     for(int i=1;i <= n;++i)
46         ans=max(max(ans,maxL[i]),dp[i][2]);
47
48     return ans;
49 }
50 int main()
51 {
52     while(~scanf("%d%d",&n,&x))
53     {
54         for(int i=1;i <= n;++i)
55             scanf("%lld",a+i);
56         printf("%I64d\n",Solve());
57     }
58 }

View Code

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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mem(a,b) memset(a,b,sizeof(a))
 4 #define ll long long
 5
 6 int n,x;
 7 ll a[300030];
 8 ll dp[300030][3];
 9
10 int main()
11 {
12     ll ans=0;
13     cin>>n>>x;
14     for(int i=1;i<=n;++i)
15         cin>>a[i];
16
17     mem(dp[0],0);
18     /**
19         dp[i][0]:[1,i]未使用*x所形成的最大区间和
20         dp[i][1]:[L,i-1]使用*x,并且i也使用*x所形成的最大区间和
21         dp[i][2]:[L,i-1]使用*x,但是i不使用*x所形成的最大区间和
22     */
23     for(int i=1;i<=n;++i)
24     {
25         dp[i][0]=a[i]+(dp[i-1][0] > 0 ? dp[i-1][0]:0);
26         dp[i][1]=max(0LL,max(dp[i-1][0],dp[i-1][1]))+a[i]*x;
27         dp[i][2]=max(0LL,max(dp[i-1][1],dp[i-1][2]))+a[i];
28         for(int j=0;j<3;++j)//三者去最值
29             ans=max(ans,dp[i][j]);
30     }
31     cout<<ans<<endl;
32
33     return 0;
34 }

View Code

转载于:https://www.cnblogs.com/violet-acmer/p/10758836.html

Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)相关推荐

  1. Educational Codeforces Round 63 (Rated for Div. 2) -E

    E. Guess the Root time limit per test:2 seconds memory limit per test:256 megabytes inputstandard in ...

  2. B. Game with Telephone Numbers Educational Codeforces Round 63 (Rated for Div. 2)

    题意: 给定字符串,两人游戏轮流删除一个字符,谁先让字符串长度为11且第一个是8即获胜.问先手是否必胜. 思路:0到n-10之间的8的数量大于可移除的数量/2即YES否则NO 参考代码: #inclu ...

  3. Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

    Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...

  4. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  5. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  6. Educational Codeforces Round 37 (Rated for Div. 2) 1

    Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...

  7. Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)

    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...

  8. Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

    传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici​个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...

  9. Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环

    传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...

  10. Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aia_iai​,定义一个数组是好的当且仅当对于所有iii都有ai!=ia_i!=iai​!=i.定义f(a)f(a)f(a)表示数组aaa中i& ...

最新文章

  1. linux双机脚本pkg如何生效,linux里命令pkg config工具的使用
  2. Win32开发之Format MessageBox 详解
  3. 《JUnit实战(第2版)》—第1章1.7节小结
  4. 在线应用的 Serverless 实践
  5. c语言开发调试环境搭建_Linux搭建C++开发调试环境
  6. 最新 2022维达纸业AI面试真题题库
  7. 什么是社会融资规模,M0、M1、M2?
  8. 东南亚跨境电商shopee平台有什么选品渠道?
  9. 中科探海的海底掩埋物三维实时成像声呐
  10. python 正则表达式爬图片_利用python正则表达式爬取图片
  11. 利用matlab将三维数据画成三维立体图
  12. java怎么删除一行表格_Java 创建、删除Word表格
  13. IP-Prefix List
  14. Composite 聚合——Elasticsearch 聚合后分页新实现
  15. Java实现是否为节假日、工作日判断(调用“http://api.goseek.cn/Tools/holiday”接口)
  16. 从零开始之uboot、移植uboot2017.01(七、board_init_r分析)
  17. 颜色帮你缓解职场压力 给你的心情换个色
  18. 【笔记】移植ezSIFT顺手搭建个全景照片合成器
  19. CleanMyMac4.12最新Mac电脑系统垃圾清理神器
  20. 中职计算机应用基础笔记,计算机应用基础_自考笔记+自考资料.doc

热门文章

  1. 2021-3测试通过:eclipse安装svn插件
  2. eclipse ARM/AARCH64版本下载
  3. Eclipse编译项目内存溢出,修改配置
  4. VS2015/VS2017必须在WINDOWS10上安装
  5. 从离职之日起,一年内仲裁
  6. python-devel找不到,可以试试python-dev
  7. C读取INI的代码实例
  8. oracle中存储函数,oracle中存储函数与存储过程的区别介绍
  9. mp3 播放自动 html5,HTML5打造简易播放器:Chrome运行.mp3
  10. data image转换图片php,PHP 将dataurl转成图片image方法总结