动态规划dp —— 20.环形子数组的最大和

news/2024/11/14 13:12:37/

 因为数组是环形的,所以子数组最大和有两种情况:

 一个数组内所以数的和是固定的,如果阴影部分是最大子数组和,那么空白部分就是最小子数组和,因此:第二种情况下,只需要求得最小子数组和,再用sum - min,就能得到最大子数组和。

1.状态表示

是什么?dp表中里的值所表示的含义就是状态表示

创建两个dp表,分别存储  最大子数组和  和  最小子数组和

f[i]表示:以i位置为结尾的所有子数组中的最大和

g[i]表示:以i位置为结尾的所有子数组中的最小和

2.状态转移方程

 i位置分为两种情况分别是:长度等于1,长度大于1

 f[i] = max(nums[i] , nums[i]+f[i-1]);

  g[i] = min(nums[i] , nums[i]+g[i-1]);

3.初始化

保证填表的时候不越界

 创建一个虚拟节点,存0,不会影响后续填表

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了

从左往右

5.返回值

题目要求+状态表示

正常情况下,我们只需要返回(f表里的最大值) 和 (sum - g表里的最小值)中的最大值

但是,如给的表里全是负数,这样就会返回0(sum - g表里的最小值)

显然这样是错误的

所以我们要做出判断,当 sum - g表里的最小值 == 0 时,应该返回f表里的最大值

6.代码

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();//1.创建dp表vector<int> f(n+1);vector<int> g(n+1);//2.初始化f[0] = g[0] = 0;//3.填表int sum = 0;for(int i = 1;i < n+1;i++){f[i] = max(nums[i-1] , nums[i-1]+f[i-1]);g[i] = min(nums[i-1] , nums[i-1]+g[i-1]);sum += nums[i-1];}//4.返回值int retf = INT_MIN;int retg = INT_MAX;for(int j = 1;j < n+1;j++){retf = max(retf,f[j]);retg = min(retg,g[j]);}if(sum - retg == 0){return retf;}return max(sum - retg,retf);}
};


http://www.ppmy.cn/news/337046.html

相关文章

PostgreSQL如何查看事务所占有的锁?

表级锁命令LOCK TABLE 在PG中&#xff0c;显式地在表上加锁的命令为“LOCK TABLE”&#xff0c;此命令的语法如下&#xff1a; LOCK [TABLE] [ONLY] name [,...][IN lockmode MODE] [NOWAIT]语法中各项参数说明如下&#xff1a; name&#xff1a;表名lockmode&#xff1a;表…

京东双 11 大促价疑遭提前泄露;库克:iPhone 11 中国定价策略成功;GitLab 重大安全版本更新 | 极客头条...

整理 | 屠敏 快来收听极客头条音频版吧&#xff0c;智能播报由标贝科技提供技术支持。 「CSDN 极客头条」&#xff0c;是从 CSDN 网站延伸至官方微信公众号的特别栏目&#xff0c;专注于一天业界事报道。风里雨里&#xff0c;我们将每天为朋友们&#xff0c;播报最新鲜有料的新…

11月1日科技资讯|京东双 11 大促价疑遭提前泄露;库克:iPhone 11 中国定价策略成功;GitLab 重大安全版本更新 | 极客头条

「CSDN 极客头条」&#xff0c;是从 CSDN 网站延伸至官方微信公众号的特别栏目&#xff0c;专注于一天业界事报道。风里雨里&#xff0c;我们将每天为朋友们&#xff0c;播报最新鲜有料的新闻资讯&#xff0c;让所有技术人&#xff0c;时刻紧跟业界潮流。 快讯通知 吴德周&…

【华为OD机试真题 C语言】25、考勤信息 | 机试真题+思路参考+代码解析

文章目录 一、题目&#x1f383;题目描述&#x1f383;输入输出&#x1f383;样例1&#x1f383;样例2 二、思路参考三、代码参考 作者&#xff1a;KJ.JK &#x1f342;个人博客首页&#xff1a; KJ.JK &#x1f342;专栏介绍&#xff1a; 华为OD机试真题汇总&#xff0c;定期…

2.21 alarm函数 2.22setitimer定时器函数

2.21 alarm函数 #include <unistd.h> unsigned int alarm(unsigned int seconds);功能&#xff1a;设置定时器&#xff08;闹钟&#xff09;。函数调用&#xff0c;开始倒计时&#xff0c;当倒计时为0的时候&#xff0c; 函数会给当前的进程发送一个信号&#xff1a;SIG…

【实战】体验训练Geneface

一.环境 conda activate geneface export PYTHONPATH./ CUDA_VISIBLE_DEVICES0 python tasks/run.py --configegs/datasets/lrs3/lm3d_syncnet.yaml --exp_namelrs3/syncnet 训练这篇出过的一些奇奇怪怪的问题基本上都记录在【环境搭建】40系一些奇奇怪怪的环境问题_weixin_50…

达人评测 i9 12900H和i5 12500h选哪个

i5 12500H为4大核8小核&#xff0c;12核心16线程设计&#xff0c;CPU主频 2.5GHz 最高睿频 4.5GHz 三级缓存为18MB 功耗(TDP) 45W.选 i5 12500H还是i9 12900H这些点很重要 http://www.adiannao.cn/dy i9 12900H采用7nm 制作工艺14核心20线程&#xff0c;主频为2.5GHz&#xff0…

大数据营销【3】

1.大数据获取的个人信息比传统调研获得的个人信息真实性 A.更低 B.更高 C.相同 D.不确定 2.分类变量使用&#xff08;&#xff09;建立预测模型 A.分类树 B.回归树 C.决策树 D.离散树 3.面向用户提供大数据一站式部署方案&#xff0c;包括数据中心和服务器等硬件、数据分析…