• 【c++刷题Day2】专题2线性DP


    这是C++刷题的Day2
    在这里插入图片描述
    🚀题目描述
    🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡
    欢乐谷中有若干个宝石排成一行,这些宝石,有些是正能量,有些是负能量。相邻的若干个宝石可以合并到一起,合并的时候发出能量,能量值为这些合并在一起宝石各自能量之和。你可以从任何一颗宝石开始到任何一颗宝石为止,但是必须是连续取。如何获得最大能量呢?方案可能不唯一,你只要输出这个最大能量即可。

    输入格式

    共两行

    第一行,一个正整数n(n<=1000000),表示宝石的数量;

    第二行,n个整数,分别表示n个宝石各自的能量xi(-1000<=xi<=1000)。

    输出格式

     一个整数,表示连续若干颗宝石合并后的能量的最大值。
    
    • 1

    输入样例

    5

    -3 5 -1 4 -2

    输出样例

    8

    数据规模

    0

    -1000<=xi<=1000

    🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡🗡
    🔑思路

    思路1:暴力枚举
    枚举左端点和右端点,接下来计算获得的能量,取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]

    💯CODE代码:

    #include 
    using namespace std ;
    const int N = 1e6 + 10 ;
    int f[N] ;
    int n , x ;
    int res ;
    int main () {
    	cin >> n ;
    	for (int i = 1; i <= n; i ++) {
    		cin >> x ;
    		f[i] = max (f[i - 1] + x , x) ;
    		res = max (res , f[i]) ;
    	} cout << res ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Java的jmap命令使用详解
    面试题—JAVA基础9.19/20
    基于Springboot自习预约管理系统
    递归解析Json,实现生成可视化Tree+快速获取JsonPath
    文件加密系统是如何实现企业数据高效安全保护的?
    mysql 8.0 版本innodb 内存管理锁 buffer pool mutex 变化
    操作系统考研笔记
    Android S从桌面点击图标启动APP流程 (五)
    HBase集群复制之验证
    删除有序数组中的重复项Ⅱ--------题解报告
  • 原文地址:https://blog.csdn.net/m0_60519493/article/details/126342747