题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231

  

给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+, ...,
Nj },其中 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -, , -, , -, - },其最大连续子序列为{ , -, },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。

  首先我们会想到n^2的做法就是先求出前缀和,然后枚举最大子序列的起点和终点。但此题数据范围是n<=10000,并且多组数据,所以n^2做法是会超时的。那么应该怎么优化那?

  这道题正解是dp,dp【i】代表以i为结尾的最大子序列和,这样终点是固定的,而起点是随意的,那么我肯定找最优的起点,以2为例,如果第一个元素是正的,那么我一定会加到dp[2]上,如果是负的,那dp[2]最大就是a[2]同样的依次类推,dp[i]就可以求出以i为结尾的最大子序列和,这样如果dp【i-1】是负的,那么dp【i】=a[i](a[i]即原始序列的第i个元素),否则dp[i]=dp[i-1]+a[i],这样最后只需要在扫一遍dp数组就可以知道最大子序列和是多少了。

  本题还要求输出起止两个元素,所以要在处理一下,代码:

 #include<iostream>
#include<cstdio>
using namespace std;
int n;
int a[];
int dp[];
int s[];
int ans;
int t1,t2;
int main()
{
while()
{
scanf("%d",&n);
if(n==)break;
ans=-;
for(int i=;i<=n;++i)scanf("%d",&a[i]),s[i]=s[i-]+a[i];
for(int i=;i<=n;++i)
dp[i]=max(dp[i-]+a[i],a[i]);
t1=,t2=n;
for(int i=;i<=n;++i)
if(dp[i]>ans)ans=dp[i],t2=i;
if(t2==n&&ans==-)
{
printf("0 %d %d\n",a[],a[n]);
}else
{
for(int i=;i<=t2;++i)
if(s[t2]-s[i-]==ans)
{
t1=i;break;
}
printf("%d %d %d\n",ans,a[t1],a[t2]);
}
}
return ;
}

hdu1231 最长连续子序列和的更多相关文章

  1. HDU1231 最长连续子序列

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  2. TOJ 5065: 最长连续子序列

    5065: 最长连续子序列   Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 140   ...

  3. 【TOJ 5065】最长连续子序列(前缀和)

    Description 给定一系列非负整数,求最长的连续子序列,使其和是7的倍数. Input 第一行为正整数N(1<=N<=50000),接下来有N行,每行有一个非负整数,所有整数不大于 ...

  4. 最长连续子序列 Longest Consecutive Sequence

    2018-11-25 16:28:09 问题描述: 问题求解: 方法一.如果不要求是线性时间的话,其实可以很直观的先排序在遍历一遍就可以得到答案,但是这里明确要求是O(n)的时间复杂度,那么就给了一个 ...

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

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

  6. leetcode 128. 最长连续子序列

    题目描述: 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入:[100, 4, 200, 1, 3, 2] 输出:4 即最长的连续序列为 [1,2, ...

  7. 最长连续子序列(dp,分而治之递归)

    5227: 最大子列和问题 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 总提交: 76            测试通过:46 描述 给定KK个整数组 ...

  8. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

  9. BNUOJ 4215 最长公共连续子序列

    最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class ...

随机推荐

  1. threading包的例子和queue包的例子

    参考:https://www.cnblogs.com/tkqasn/p/5700281.html 参考:https://www.cnblogs.com/tkqasn/p/5700281.html th ...

  2. JavaScript用在哪里

    <script> 标签 在HTML,JavaScript代码必须插入<script> 和 </script>之间的. document.getElementById ...

  3. bzoj2460题解

    [题意分析] 给你一个可重复数集,要求从中选取一个关于异或空间线性无关的子集,使子集的权值和最大. [解题思路] 定义:一个有序对(S,I)称为拟阵当且仅当该有序对满足以下性质: 1.有穷性:S是一个 ...

  4. DHCP服务器怎么设置怎么启动

    DHCP:动态主机配置协议,服务器用于为网络中的客户端自动分配IP地址.这种方法避免了由于手动配置IP地址导致的IP地址冲突问题,同时也减少了网络管理员的工作量. 工具/原料 在配置DHCP服务器时, ...

  5. vue-lazyload 图片不更新

    前几天在用vue写项目的时候,因为图片比较多,所以采用了懒加载插件 vue-lazyload github:https://github.com/hilongjw/vue-lazyload#readm ...

  6. 【SpringBoot】 Java中如何封装Http请求,以及JSON多层嵌套解析

    前言 本文中的内容其实严格来说不算springboot里面的特性,属于JAVA基础,只是我在项目中遇到了,特归纳总结一下. HTTP请求封装 目前JAVA对于HTTP封装主要有三种方式: 1. JAV ...

  7. 像计算机科学家一样思考python-第2章 变量、表达式和语句

    感想: 1.程序出现语义错误时,画状态图是一个很好的调试办法.打印出关键变量在不同代码处理后值的变化,就能发现问题的蛛丝马迹. 2.每当学习新语言特性时,都应当在交互模式中进行尝试,并故意犯下错误,看 ...

  8. elasticsearch 5.1 认证过期 (your license has expired)

    首先说一下License过期后的状况: if 设置了登录认证,license过期后将无法登录(无法填入用户名密码,下方给出报错,license过期): if 没有设置登录认证,打开kibaba界面中M ...

  9. Selenium WebDriver高级应用

    WebDriver高级应用 public class Demo4 { WebDriver driver; // @BeforeMethod:在每个测试方法开始运行前执行 @BeforeMethod p ...

  10. MySQL 查询语句--------------进阶6:连接查询

    #进阶6:连接查询 /* 含义:多个表格连接,当查询的字段来自于多个表时候,就会用到连接查询 我觉得这里类似于excel中的vlookup函数 笛卡尔乘积现象:表1有m行,表2有n行,结果有m*n行 ...