给定一个整数序列,找到一个具有最大和的连续子序列(子序列最少包含一个元素),返回其最大和。

实例输入: -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] 结尾的连续序列,那么只有两种情况:

  1. 这个最大和的连续序列只有一个元素,即以 A[i] 开始,以 A[i] 结尾。
  2. 这个最大和的连续序列有多个元素,即从前面某处 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 ;
}

变式:两段最大连续子序列--POJ1481

思路:这道题目的基础就是最大连续子序列和,但是更加强化了。核心思路是从前往后和从后往前分别得到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-最大连续子序列和的更多相关文章

  1. POJ - 3061 Subsequence(连续子序列和>=s的最短子序列长度)

    Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...

  2. POJ2479(最长连续子序列和)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37035   Accepted: 11551 Des ...

  3. lintcode 最长上升连续子序列 II(二维最长上升连续序列)

    题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...

  4. 最大连续子序列乘积(DP)

    题目来源:小米手机2013年校园招聘笔试题 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含多个测试样例.每个测试样例的第一行仅包含正整数 ...

  5. DP专题训练之HDU 1231 最大连续子序列

    Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...

  6. HDU 1231 最大连续子序列(水题)

    题目链接: 传送门 最大连续子序列 Time Limit: 1000MS     Memory Limit: 32768 K Description 给定K个整数的序列{ N1, N2, ..., N ...

  7. HDU-1231 简单dp,连续子序列最大和,水

    1.HDU-1231 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 3.总结:水 题意:连续子序列最大和 #include<iostre ...

  8. HDU 1231:最大连续子序列 解题报告

    第一次写博客, 自己总结写出了一道题感觉值得保存. 自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大 ...

  9. [ACM_其他] 总和不小于S的连续子序列的长度的最小值——尺缩法

    Description: 给定长度为n的整数数列,A[0],A[1],A[2]….A[n-1]以及整数S,求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. Input: 输入数据有 ...

  10. UVa 108 - Maximum Sum(最大连续子序列)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

随机推荐

  1. 添加wcf服务引用,无法签出当前文件

    写了一些wcf服务接口,使用控制台可以正常启动服务,想要测试一下,新建项目添加服务引用,提示:“无法签出当前文件.该文件可能为只读或已锁定,或者您需要手动签出它.” 在网上找了找,有说可能是因为源代码 ...

  2. .Net Core 给WebApi接口返回值添加全局的日期格式化

    public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(option ...

  3. .NET Core的依赖注入

    转自[大内老A] 依赖注入[1]: 控制反转依赖注入[2]: 基于IoC的设计模式依赖注入[3]: 依赖注入模式依赖注入[4]: 创建一个简易版的DI框架[上篇]依赖注入[5]: 创建一个简易版的DI ...

  4. Mac下Appnium的Android的UI自动化环境搭建

    1. 安装jdk:略 检查是否安装:执行命令java -version admindeMacBook-Pro-2:~ $ java -version java version "1.8.0_ ...

  5. 何为KVM克隆和快照

    KVM的克隆.快照都是老生常谈的问题,资料也非常多,这里只是针对个人实验的记录,方便以后查阅. 虚拟机克隆 虚拟机的克隆操作是再频繁不过了,安装好第一台虚拟机后就可以进行基础设置,已此虚拟机为模板,以 ...

  6. ADO.NET 根据实体类自动生成添加修改语句仅限Oracle使用

    话不多说直接上代码,新手上路,高手路过勿喷,请多多指教. /// <summary> /// 等于号 /// </summary> ) + Convert.ToChar() + ...

  7. Stage3D大冒险

    摘自:http://dreamana.com/weblog/?p=92 摘自:http://baike.baidu.com/view/6794042.htm Stage3D的Flash Player和 ...

  8. 如何开发出成功的iOS应用(流程图)

    转自:http://mobile.51cto.com/hot-307342.htm 近来,肥沃的应用开发土壤不断孕育出一个个振奋人心的故事,成千上万的人都觊觎从这个机遇无限的领域中分一杯羹.虽然现在的 ...

  9. MySQL数据物理备份之tar打包备份

    复制数据文件方式,可以使用cp或tar 1.停止服务 [root@localhost mysql]# systemctl stop mysqld [root@localhost mysql]# net ...

  10. mysql系列2 权限相关

    mysql授权认证 请注意(大坑):mysql8.0以前的版本可以使用grant在授权的时候隐式的创建用户,8.0以后已经不支持,所以必须先创建用户,然后再授权!! 例子: 在170mysql主机上授 ...