这是C++刷题的Day2
🚀题目描述
🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡
欢乐谷中有若干个宝石排成一行,这些宝石,有些是正能量,有些是负能量。相邻的若干个宝石可以合并到一起,合并的时候发出能量,能量值为这些合并在一起宝石各自能量之和。你可以从任何一颗宝石开始到任何一颗宝石为止,但是必须是连续取。如何获得最大能量呢?方案可能不唯一,你只要输出这个最大能量即可。
输入格式
共两行
第一行,一个正整数n(n<=1000000),表示宝石的数量;
第二行,n个整数,分别表示n个宝石各自的能量xi(-1000<=xi<=1000)。
输出格式
一个整数,表示连续若干颗宝石合并后的能量的最大值。
输入样例
5
-3 5 -1 4 -2
输出样例
8
数据规模
0 -1000<=xi<=1000 🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡 思路1:暴力枚举 💯CODE代码:
🔑思路
枚举左端点和右端点,接下来计算获得的能量,取max,时间复杂度:O(N^3),超时
思路2:暴力枚举+前缀和
枚举左端点和右端点,接下来直接通过前缀和数组获取总能量值,取max,时间复杂度:O(N^2),超时
思路3:动态规划
设状态f[i]表示[1,i]的最大区间子段和,那么对于a[i],有两种选择:
与i-1和为一段,能量值为:f[i-1]+a[i]
不与i-1和为一段,单独成段,能量值为a[i]#include