POJ-最大连续子序列和
给定一个整数序列,找到一个具有最大和的连续子序列(子序列最少包含一个元素),返回其最大和。
实例输入: -2, 1, -3, 4, -1, 2, 1, -5, 4
实例输出: 6(连续子序列4, -1, 2, 1的和最大,为 6。)
下面介绍动态规划的做法,复杂度为 O(n)。
步骤 1:令状态 dp[i] 表示以 A[i] 作为末尾的连续序列的最大和(这里是说 A[i] 必须作为连续序列的末尾)。
步骤 2:做如下考虑:因为 dp[i] 要求是必须以 A[i] 结尾的连续序列,那么只有两种情况:
- 这个最大和的连续序列只有一个元素,即以 A[i] 开始,以 A[i] 结尾。
- 这个最大和的连续序列有多个元素,即从前面某处 A[p] 开始 (p<i),一直到 A[i] 结尾。
对第一种情况,最大和就是 A[i] 本身。
对第二种情况,最大和是 dp[i-1]+A[i]。
于是得到状态转移方程:dp[i] = max{A[i], dp[i-1]+A[i]}
这个式子只和 i 与 i 之前的元素有关,且边界为 dp[0] = A[0],由此从小到大枚举 i,即可得到整个 dp 数组。接着输出 dp[0],dp[1],...,dp[n-1] 中的最大子即为最大连续子序列的和。
- #include<cstdio>
- #include<cstring>
- int max(int a, int b){return a>b?a:b;}
- int main() {
- int n;
- int a[], dp[];
- scanf("%d", &n);//输入序列长度
- for(int i=; i<n; i++) scanf("%d", &a[i]);
- dp[] = a[];
- for(int i=; i<n; i++) dp[i] = max(a[i], dp[i-] + a[i]);
- int ans = dp[];
- for(int i=; i<n; ++i)
- {
- if(dp[i] > ans) ans = dp[i];
- }
- printf("%d\n", ans);
- return ;
- }
思路:这道题目的基础就是最大连续子序列和,但是更加强化了。核心思路是从前往后和从后往前分别得到dp,再分别用另一个数组存储到某位置最大值,然后再找最大值。具体看代码。
- #include<iostream>
- #include<cstring>
- using namespace std;
- const int N = ;
- int a[N],s1[N],s2[N],dp1[N],dp2[N];//s1,s2分别记录到第i个位置的最大序列和(并不要求以i结尾)
- int ans, n;
- void f()
- {
- s1[]=a[], dp1[]=a[], s2[n-]=a[n-], dp2[n-]=a[n-];
- for(int i=;i<n;i++)
- {
- dp1[i]=max(dp1[i-]+a[i],a[i]);
- s1[i]=max(s1[i-],dp1[i]);
- }
- for(int i=n-;i>=;i--)
- {
- dp2[i]=max(dp2[i+]+a[i],a[i]);
- s2[i]=max(s2[i+],dp2[i]);
- }
- for(int i=;i<n;i++)ans=max(ans,s1[i-]+s2[i]);
- }
- int main() {
- int T;
- cin>>T;
- while(T--)
- {
- cin>>n;
- for(int i=;i<n;i++)cin>>a[i];
- ans = -;//因为如果都是负元素就选两个最小的负元素 ,不会小于-20000
- f();
- cout<<ans<<endl;
- }
- return ;
- }
POJ-最大连续子序列和的更多相关文章
- POJ - 3061 Subsequence(连续子序列和>=s的最短子序列长度)
Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...
- POJ2479(最长连续子序列和)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37035 Accepted: 11551 Des ...
- lintcode 最长上升连续子序列 II(二维最长上升连续序列)
题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...
- 最大连续子序列乘积(DP)
题目来源:小米手机2013年校园招聘笔试题 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含多个测试样例.每个测试样例的第一行仅包含正整数 ...
- DP专题训练之HDU 1231 最大连续子序列
Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...
- HDU 1231 最大连续子序列(水题)
题目链接: 传送门 最大连续子序列 Time Limit: 1000MS Memory Limit: 32768 K Description 给定K个整数的序列{ N1, N2, ..., N ...
- HDU-1231 简单dp,连续子序列最大和,水
1.HDU-1231 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 3.总结:水 题意:连续子序列最大和 #include<iostre ...
- HDU 1231:最大连续子序列 解题报告
第一次写博客, 自己总结写出了一道题感觉值得保存. 自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大 ...
- [ACM_其他] 总和不小于S的连续子序列的长度的最小值——尺缩法
Description: 给定长度为n的整数数列,A[0],A[1],A[2]….A[n-1]以及整数S,求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. Input: 输入数据有 ...
- UVa 108 - Maximum Sum(最大连续子序列)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
随机推荐
- Markdown温故知新(0):导航目录
Markdown温故知新(0):导航目录 Markdown温故知新(1):Markdown面面观 Markdown温故知新(2):详解七大标准语法 Markdown温故知新(3):六个实用扩展语法 M ...
- Extjs 树菜单的自动展开数据的请求
今天在做extjs开发的时候,在树菜单上遇到了一个坑,也许是我刚接触extjs 不熟的缘故 问题描述:后台设置的树自动展开,但是在前端总是只显示一条数据,但是数据确实都请求到了. 经过几个小时不屑的努 ...
- 记录Mac OS下编译Thrift库
方法一:brew管理工具安装Homebrew是Mac开发包管理工具,类似于Linux的apt-get之类的,实它相当于开发软件界的 Appstore.借助该管理工具,可以自动化地安装软件包,它会自动安 ...
- django 开发Broken pipe from ('127.0.0.1', 58078)问题解决
最近写的一个项目,前端使用了表单submit提交,后端接收POST数据存储.实际上的逻辑并不复杂, django接收到的时候会产生Broken pipe from ('127.0.0.1', 5807 ...
- Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- Quality Center安装步骤
测试管理工具 u 安装条件: Quality Center:QC9中文版 数据库:Oracle10 g 操作系统:Windows XP u 安装步骤: 1. 点击setup.exe,出现如下界面,点 ...
- 下载win10系统
有时候想重装系统但总找不到下载的地方,今天记录一下.nsdn我告诉你,这里有许多软件下载 网站URL:https://msdn.itellyou.cn/ 我想下载一个Windows10 磁力地址 ed ...
- 常用SQL语句分享
前言: 日常工作或学习过程中,我们可能会经常用到某些SQL,建议大家多多整理记录下这些常用的SQL,这样后续用到会方便很多.笔者在工作及学习过程中也整理了下个人常用的SQL,现在分享给你!可能有些S ...
- 面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理
一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,class) 2.issubclass是用来判断一个类是否为另一个 ...
- MySQL索引(九)
一.索引介绍 1.1 什么是索引 索引就好比一本书的目录,它会让你更快的找到内容. 让获取的数据更有目的性,从而提高数据库检索数据的性能. 分为以下四种: BTREE:B+树索引(基本上都是使用此索引 ...