当前位置: 首页 > news >正文

最大子数组(有限制)

前言:最大子数组问题之前做过,但是一时脑抽没有记起来


在这里插入图片描述

我们的普通做法有动态规划,我们设置dp[ i ] 为以 i 结尾的最优解

class Solution {
public:int maxSubArray(vector<int>& nums) {int ans = nums[0];int now = nums[0];for (int i = 1; i < nums.size(); i++) {if (now>= 0) {now = now + nums[i];}else now = nums[i];ans = max(ans, now);}return ans;}
};

我们还可以用前缀和的思路去做

这个思路特别妙,我们只要用当前的前缀和减去之前最小的前缀和,那么就可以得到以 i 结尾的最优解

class Solution:def maxSubArray(self, nums: List[int]) -> int:ans = -infmin_pre_sum = pre_sum = 0for x in nums:pre_sum += x  # 当前的前缀和ans = max(ans, pre_sum - min_pre_sum)  # 减去前缀和的最小值min_pre_sum = min(min_pre_sum, pre_sum)  # 维护前缀和的最小值return ans

我们再来看一个进阶版的题目
题目地址

在这里插入图片描述
这个我们加入了限制 w ,除外其实就是一个最大子数组

#include<bits/stdc++.h>
using namespace std;#define int long longint n,wei;
const int N = (int) 1e6+10;
int w[N],d[N];
int sum[N];signed main(){cin >> n >> wei;for(int i=1;i<=n;i++){cin >> w[i];}for(int i=1;i<=n;i++){cin >> d[i];sum[i] = sum[i-1] + d[i];}int ans = LLONG_MIN;int now = 0;set<int> b;int l = 1;for(int i=1;i<=n;i++){now += w[i];while(now>wei){b.insert(sum[l-1]);now -= w[l++];}if(!b.empty()) ans = max(ans,sum[i]-*b.begin());}cout << ans << endl;return 0;
}

http://www.mrgr.cn/news/14916.html

相关文章:

  • 【BPF之旅】认识eBPF
  • cola_os学习笔记(下)
  • mysql8.0查询等级排名可使用窗口函数,那5.7的版本呢?
  • 设计模式-简单工厂模式工厂方法模式
  • cesium模型加载-点击-高亮
  • 自定义全局变量在uniapp的Vuex应用
  • 数字三角形
  • BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)
  • 装饰器(Decorators)的实现
  • 基于RK3588+MCU智能清洁车应用解决方案
  • erlang学习:用OTP构建系统2,警报管理
  • CTF密码学小结
  • 面试题集锦:数据库
  • 在随机点实现凸包包围游戏地区
  • 电商模式的解析
  • 【Python机器学习】NLP词频背后的含义——从词频到主题得分
  • 2.3 阿里巴巴-背包问题
  • 跨链互通:Web3如何实现多链互操作性
  • 如何用Java SpringBoot+Vue打造摇滚乐鉴赏网站:从设计到实现全解析
  • helm学习第四篇-微服务组件的加入