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 可以形成的最大区间和;
![](/assets/blank.gif)
![](/assets/blank.gif)
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
巨巨代码(额外增加点我的注释)
![](/assets/blank.gif)
![](/assets/blank.gif)
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(动态规划.递推)相关推荐
- 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 ...
- B. Game with Telephone Numbers Educational Codeforces Round 63 (Rated for Div. 2)
题意: 给定字符串,两人游戏轮流删除一个字符,谁先让字符串长度为11且第一个是8即获胜.问先手是否必胜. 思路:0到n-10之间的8的数量大于可移除的数量/2即YES否则NO 参考代码: #inclu ...
- 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这个时候两 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
- 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, ...
- Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs
传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...
- Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环
传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...
- 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& ...
最新文章
- linux双机脚本pkg如何生效,linux里命令pkg config工具的使用
- Win32开发之Format MessageBox 详解
- 《JUnit实战(第2版)》—第1章1.7节小结
- 在线应用的 Serverless 实践
- c语言开发调试环境搭建_Linux搭建C++开发调试环境
- 最新 2022维达纸业AI面试真题题库
- 什么是社会融资规模,M0、M1、M2?
- 东南亚跨境电商shopee平台有什么选品渠道?
- 中科探海的海底掩埋物三维实时成像声呐
- python 正则表达式爬图片_利用python正则表达式爬取图片
- 利用matlab将三维数据画成三维立体图
- java怎么删除一行表格_Java 创建、删除Word表格
- IP-Prefix List
- Composite 聚合——Elasticsearch 聚合后分页新实现
- Java实现是否为节假日、工作日判断(调用“http://api.goseek.cn/Tools/holiday”接口)
- 从零开始之uboot、移植uboot2017.01(七、board_init_r分析)
- 颜色帮你缓解职场压力 给你的心情换个色
- 【笔记】移植ezSIFT顺手搭建个全景照片合成器
- CleanMyMac4.12最新Mac电脑系统垃圾清理神器
- 中职计算机应用基础笔记,计算机应用基础_自考笔记+自考资料.doc
热门文章
- 2021-3测试通过:eclipse安装svn插件
- eclipse ARM/AARCH64版本下载
- Eclipse编译项目内存溢出,修改配置
- VS2015/VS2017必须在WINDOWS10上安装
- 从离职之日起,一年内仲裁
- python-devel找不到,可以试试python-dev
- C读取INI的代码实例
- oracle中存储函数,oracle中存储函数与存储过程的区别介绍
- mp3 播放自动 html5,HTML5打造简易播放器:Chrome运行.mp3
- data image转换图片php,PHP 将dataurl转成图片image方法总结