力扣 | 1186删除一次后子数组最大 | 经典动态规划 | 状态描述

92 篇文章 0 订阅
42 篇文章 0 订阅

在所有的子数组中找到 删除一次操作或者不删除后的最大值(是计算当前子数组经过操作或者不操作的和,然后遍历所有子数组,找到最大值)

一想到最大值,又是所有子数组        大概率就是要用到动态规划

这题的思想和之前的真的特别像,一下子想不起来也不好找了,后续补上

/*
用dp[i][k]表示以arr[i]结尾的子数组删除k次后的最大值
当然我们要求 k = 0 或者 1

对dp[i][k]进行分析
    dp[0][0] 就是arr[0]    
    dp[0][1] 不存在
接着 i > 0 分析
    dp[i][0] = max(dp[i - 1][0] , 0) + arr[i]        需要注意的是如果某次子数组之和为负数,直接pass 紧接着的子数组最大和就是 该元素的值 也就是 0 + arr[i]
    dp[i][1] = max(dp[i - 1][1] + arr[1] , dp[i - 1][0])    删除一次,可能在之前的子数组就删了一次,那么直接在前者基础上加当前元素值,也可能删的是当前元素的值,那么最大值就是前子数组之和了
    
    
    int dp00 = arr[0];
    int dp01 = 0;
    int ans;

    for(int i = 1; i < n; ++i){
        dp01 = max(dp01 + arr[i], dp00);
        dp00 = max(dp00, 0) + arr[i];        //由于dp01 会用 上一次的dp00 所以更新后的dp00在dp01更新之前
        ans = max(ans, max(dp00, dp01);
    }
    
    return ans;

*/

 双厨狂喜!

题还是要勤刷!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值