最大连续子序列
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17937 Accepted Submission(s): 7938
Problem Description
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Input
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6 5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
Huge input, scanf is recommended.
Hint
Hint
思路:
简单DP。dp [ i ] 代表到 i 为止的最大和,所以 dp [ i ] = max ( dp [ i - 1 ] + num [ i ] , num [ i ] )(O(n ^ 2)),代表要不加上 num [ i ],要不就从 num [ i ],dp 维护的是每个值的最优连续方案,所以要求出最终的最大值,还需要循环一遍取判断出最大值。所以边更新的时候边比较最大值,且记录起点和终点即可,若最大和为负数,则输出 0 和首尾两个元素即可。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int num[10005], dp[10005]; int main () { int n; while (~scanf("%d", &n) && n) { for (int i = 1; i <= n; ++i) { scanf("%d", &num[i]); } int Max = num[1], sta = 1, End = 1; int ssta = 1, EEnd = 1; dp[1] = num[1]; for (int i = 2; i <= n; ++i) { if (dp[i - 1] + num[i] > num[i]) { dp[i] = dp[i - 1] + num[i]; End = i; } else { dp[i] = num[i]; sta = End = i; } if (dp[i] > Max) { ssta = sta; EEnd = End; Max = dp[i]; } } if (Max < 0) printf("%d %d %d\n", 0, num[1], num[n]); else printf("%d %d %d\n", Max, num[ssta], num[EEnd]); } return 0; }
相关推荐
动态规划解最大自序列和经典DP算法 最大连续子序列
适合初学者,经典DP
如下例子所示,acg是abcdefg的子序列,但不是连续子序列。 abcdefg ==> acg 两个字符串的最大公共子序列的状态转移方程式如下: dp[i][j]={max{dp[i−1][j],dp[i][j−1]}if s1[i]!=s2[j]dp[i][j]+1if s1[i] =...
给定一个无序的整数数组,找到其中最长上升子序列的长度。 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明:可能会有多种最长上升子序列的组合,你只需要输出...
最长上升子序列问题可以这样定义:给定一个无序的整数数组,任务是找到该数组中一个最长的子序列,使得这个子序列中的元素从左到右是严格递增的...最后,我们遍历dp数组,找到其中的最大值,即为最长上升子序列的长度。
网络赛取连续子序列问题 线段树+树状数组+并查集,转化为排队问题 离散化 离散化矩形切割,矩形覆盖面积统计 覆盖矩形周长统计 离散化矩形切割 灯光投影 搜索 导弹 Bfs+hash状态的抽象,模关系 Bfs变形,钥匙...
因此,最终整个序列的最长升序子序列长度是dp数组中的最大值 dp通项为\( dp[i] = max(dp[i], dp[j] + 1), i > j 且 num[i] > nums[j] \) 双串, tips:用一个二维数组表示两个字符串对应的子串的公共子串的长度的...
连续子序列最大和 30days遇到两次变种 300 寻找数组中最大的递增子列 322 硬币组合问题 sort 快排 手撕次数>2 冒泡 周围测试友人经常遇到 324 特殊排序 a0 < a1 > a2 406 区间特殊排序 BinarySearch 367 判断是否...
连续子数组和 最长递增子序列 最长公共子序列 想法 联合发现 下一个置换算法 将二维矩阵转换为一维数组 有一个公式可以将二维矩阵转换为一维数组,反之亦然 -- n * m 矩阵转换为数组 => matrix[x][y] => a[x * m + y...
leetcode 给房子涂色力码 笔记 进步 问题 回答 标签 评论 001.二和 CPP 数组、哈希表 ...字符串、回溯、DP ...创建最大数 ...DP,贪婪 ...第三个最大数 ...最长连续递增子序列 CPP 大批 189. 旋转数组 CPP 大批 448. 找
婚恋网站java源码面试准备 注意:此准备已移至 . 此 repo 将仅用作某些文件的历史记录和存储。 给定问题... 澄清问题 ...最长递增子序列 dp[i]: 最大到这里结束 LRU 缓存* O(1):队列为双链表 + Ha
使用DP的最长公共子序列。 使用动态规划(制表和记忆)的最长递增子序列。 第 5 天:2020 年 8 月 5 日 矩阵链乘法。 使用 DP 的加泰罗尼亚数概念(二叉搜索树的计数)。 第 6 天:2020 年 8 月 6 日 带有递归的代码...
递增子序列[ 蛮力] 488 祖玛游戏[ BFS ] 487 最大连续一个- II 空间解决方案O(1) ] 486预测胜利者[DP+博弈论| 更短的代码] 485 最大连续一个 [ 蛮力 ] 484 查找排列 [ 拓扑排序 | 建设性方法] 483 最小的好基 [ 蛮力...
由于我们的声音信号不是连续给出的,而且现场还有噪声的存在,所以我们必须通过适当的方法来判断采集的数据是不是我们所要的声音控制信号。这又是该项目的一个重点。若声音指令信号提取的不恰当,那么我们采样所得的...