环形数组 最大子段和 dp】的更多相关文章

题目链接:https://nanti.jisuanke.com/t/36118 环形数组的连续最大子段和,有两种情况. 1.最大和的这个子段没有包含头尾.所以直接dp[i] = max(dp[i-1]+a[i],a[i]) 2.最大和的这个子段包含了头尾.这个时候,最大和 = 累积和 - 连续子段最小和. 然后比较两种情况的大小,输出大的那一个就行. #include <bits/stdc++.h> #define ms(a) memset(a,0,sizeof(a)) #define ll…
Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 分析: 有两种可能,第一种为正常从[1 - n]序列中的最大子字段和:第二种为数组的total_sum - ([1-n]序列中的最短序列和) 最后结果为 max { 第一种, 第二种}. 对于第二种: 循环数组求最大子段和,可能出现中间的一部分不要,要两边的数.比如:-1 4 -1 -5 5 -2 1 -1 3,他的最大子段和就为 左边的-1 4加上右边的5 -2 1 -1 3,也就是,去掉1 -5这一段后的结果.而…
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列).当所给的整数均为负数时和为0. 例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13.和为20.   Input…
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Input 两个数a,b(1 <= a <= b <= 10^18) Output 输出共10行,分别是0-9出现的次数 Input示例 10 19 Output示例 1 11 1 1…
循环数组最大子段和 输入 第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数 (-10^9 <= S[i] <= 10^9) 输出   输出循环数组的最大子段和.   输入示例 6 -2 11 -4 13 -5 -2 输出示例 20 请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案. 不同语言如何处理输入输出,请查看下面的语言说明. #include <iostream&…
14.6 Implement a CircularArray class that supports an array-like data structure which can be efficiently rotated.The class should use a generic type, and should support iteration via the standard for (Obj o : CircularArray) notation. 这道题让我们实现一个环形数组类C…
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; long long a[N]; int main(){ int n, i; ; scanf("%d", &n); ; i <= n; ++i){ scanf("%I64d", &a[i]); sum += a[i]; } ma_ed = a[]; a…
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B|\le 10^5$ ,$x\le 100$ . 题解 后缀数组+倍增RMQ+贪心+dp 设 $f[i][j]$ 表示从 $A$ 串的前 $i$ 个字符中选出 $j$ 段,能够拼出 $B$ 串的最大长度. 那么考虑转移,如果 $i+1$ 不用则 $f[i+1][j]\leftarrow f[i][j]…
任务: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 1.设计思想:这个题目显然是结合了之前二维数组求最大子数组的和以及一维环形数组求最大连续子数组的和两个模块,所以只要将两个程序联合起来即可.首先将数组横向扩展一倍,将环转换为求一维连续的数组求最大子数组和.然后将二维数组转换为一维数组求和,即建立一个新的和数组,用来储存从数组的首个…
任务要求:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.    如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 1.设计思想:(假设数组长度为n.)任务要求中提出了数组可以首尾相邻,这样在求数组最大子数组和的时候就要考虑两种情况:一是最大子数组和所在数组在A[0]...A[n]之间,不包括…
环形数组循环 给定一组含有正整数和负整数的数组.如果某个索引中的 n 是正数的,则向前移动 n 个索引.相反,如果是负数(-n),则向后移动 n 个索引. 假设数组首尾相接.判断数组中是否有环.环中至少包含 2 个元素.环中的元素一律"向前"或者一律"向后". 示例 1:给定数组 [2, -1, 1, 2, 2], 有一个循环,从索引 0 -> 2 -> 3 -> 0. 示例 2:给定数组[-1, 2], 没有循环. 注意:给定数组保证不包含元素&…
457. 环形数组循环 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是负数 (-k),则向后移动 k 个索引.因为数组是环形的,所以可以假设最后一个元素的下一个元素是第一个元素,而第一个元素的前一个元素是最后一个元素. 确定 nums 中是否存在循环(或周期).循环必须在相同的索引处开始和结束并且循环长度 > 1.此外,一个循环中的所有运动都必须沿着同一方向进行.换句话说,一个循环中不能同时包括向前的运动和向后的运动. 示例…
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 快慢指针 代码 日期 题目地址:https://leetcode.com/problems/circular-array-loop/ 题目描述 You are given a circular array nums of positive and negative integers. If a number k at an index is posi…
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这个呢,这个题之前 求一遍最大值  然后求一遍最小值 最后结果 res = max( MAX,  SUM - MIN ); 但是 这种题如果 要求 变成 最长长度为len的最大子段和,这种思路就会受限制 换一种想法, 让你求最大长度为len的最大字段和 那么 你可以维护一个前缀和 然后结果就是 max( sum[i] - min(sum[j]) , i…
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这道题的最大子段和有两种可能,一种是常规的子段和,另一种是从结尾到开头的一个子段.常规做是一种可能,另一种带循环的则可以认为是序列中间有一段最小子段和,把这段最小子段和去掉,剩下的可能就是最大子段和了. #include <bits/stdc++.h> using namespace std; typedef long long LL; * ; int…
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1050&noticeId=13385 参考:http://blog.csdn.net/acdreamers/article/details/38760805 #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int n; ll a[]; ll…
http://www.itint5.com/oj/#9 一开始有了个n*n的算法,就是把原来的数组*2,由环形的展开成数组.然后调用n次最大子段和的方法.超时. 后来看到个O(n)的算法,就是如果不跨越末尾,就是最大字段和:如果跨越末尾,就是sum-(最小子段和)http://blog.csdn.net/hackbuteer1/article/details/6694193 int maxConsSum2(const vector<int> &arr) { if (arr.size()…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所以要另外分析. 1:最大的值在原数组中间部分. 2:最大值是结尾部分和开头部分.(如果要循环,就是这种情况) 对于1情况可以做一次最大子段和.而第二种情况出现时因为,中间部分很小,加了后最后的值会变小,所以不能加,也就是说中间部分的 值取反后,是最大的.这样就可以先进行对原数组的值取反,然后求一次最…
1052 最大M子段和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和. 例如:-2 11 -4 13 -5 6 -2,分为2段,11 -4 13一段,6一段,和为26. Input 第1行:2个数N和M,中间用空格分隔.N为整数的个数,M为划分为多少段.(2 <= N , M …
[题目]: 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:*3的矩阵: - - - - 和最大的子矩阵是: - - Input 第1行:M和N,中间用空格隔开( <= M,N <= ). 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开.(-^ <= M[i] <= ^) Output 输出和的最大值.如果所有数都是负数,就输出0. Input示例 - - - - Output示例 [分析]: 在做这道题之前必…
P5241 序列 挺神仙的一题 看看除了dp好像没什么其他办法了 想着怎么构个具体的图出来,然鹅不太现实. 于是我们想办法用几个参数来表示dp数组 加了几条边肯定要的吧,于是加个参数$i$表示已加了$i$条边 这显然是不够的.于是我们又想:强连通分量.....连通块....... 于是加个$j$表示还有$j$个强连通分量 于是dp数组为$f[i][j]$ 这是我们发现一个问题,状态$f[i][j]$不一定是合法的. 那dp不就GG了吗 再次撕烤,我们发现每次加上的边无非就3种情况: 1.把2个强…
环形的解决很巧妙 #include <iostream> #include <cstring> #include <string> #include <map> #include <set> #include <algorithm> #include <fstream> #include <cstdio> #include <cmath> #include <stack> #includ…
思路: DP[ i ] 代表以 i 结尾的方案数. dp[i] += sum[i] - sum[j - 1] != 0 ? dp[j] : 0 ; 对于100%的数据,满足1<=N<=105, |Ai|<=100 n 1e5呀,两层for,GG; 利用树状数组维护sum[i],存的是以sum[i]的方案数 , 那么每次加上当前所有的方案,减去sum[i]的方案,就好了. 这里还有一个小问题就是 |sum[i]|<=1e7,所以先离散化一下就好了. 把当前所有前缀和的方案数加起来..…
N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列).当所给的整数均为负数时和为0. 例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13.和为20. 收起 输入 第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数 (-10^9 <= S[i] <…
链接: https://www.luogu.org/problemnew/show/P1115 题面: 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iAi​,描述了这段序列. 输出格式: 一个整数,为最大的子段和是多少.子段的最小长度为11. 输入输出样例 输入样例#1: 复制 7 2 -4 3 -1 2 -4 3 输出样例#1: 复制 4 说明…
P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的. 输出格式: 输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少. 输入输出样例 输入样例#1: 7 2 -4 3 -1…
You are given an array of positive and negative integers. If a number n at an index is positive, then move forward n steps. Conversely, if it's negative (-n), move backward n steps. Assume the first element of the array is forward next to the last el…
You are given an array of positive and negative integers. If a number n at an index is positive, then move forward n steps. Conversely, if it's negative (-n), move backward n steps. Assume the first element of the array is forward next to the last el…
[抄题]: Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6. 方法一:贪心算法greedy [一句话思路]: 每次…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270&judgeId=194704 一开始贪心,以为就两种情况,大.小.大.小.....这样下去 小.大.小.大.....这样下去, 结果翻车.比如1.2.1.1.2.1这个样例 就不行了. 那么以dp[i][0]表示前i个数,第i个数选了小的数字,能产生的最大差值, dp[i][1]同理,转移的时候,上一唯也是两种情况,所以一共4中情况. #include <cs…