***************************************转载请注明出处:http://blog.csdn.net/lttree***************************************

最大连续子序列

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 17941    Accepted Submission(s): 7941

Problem Description
给定K个整数的序列{ N1, N2, ..., NK },其随意连续子序列可表示为{ Ni, Ni+1, ..., 

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,输出整个序列的首尾元素。 

 
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
Hint
Hint
Huge input, scanf is recommended.
 

继续做点DP题目。这次是最大连续子序列。
这样的的状态转移方程非常easy,就是  dp[i]=max(dp[i-1]+a[i],a[i])
由于要输出首尾位置,所以我又建立了一个数组来存,到达当前位置的 首部。

这道题。在全部数据都为负数情况下,要求总和为0。输出整个数组首尾位置,
这个实现,能够用一个bool变量。在输入数据时,一个个推断——62MS
也能够再建立一个数组,然后sort排序一下,推断最大数是否为负数——125MS。并且有额外10000大空间消耗

/****************************************
*****************************************
* Author:Tree *
*From :http://blog.csdn.net/lttree *
* Title : 最大连续子序列 *
*Source: hdu 1231 *
* Hint : dp *
*****************************************
****************************************/
#include <stdio.h>
int a[10001],sum[10001],pre[10001];
int main()
{
int n,i;
int Max,Max_i;
// isnegtive来推断是否全部数都小于0
bool isnegtive;
while( scanf("%d",&n)!=EOF && n)
{
isnegtive=false;
for(i=0;i<n;++i)
{
scanf("%d",&a[i]);
if( a[i]>=0 ) isnegtive=true;
} // 假设全部数都小于0,后面不用算,直接输出
if( !isnegtive )
{
printf("0 %d %d\n",a[0],a[n-1]);
continue;
} // 计算最大序列和
sum[0]=pre[0]=a[0];
for( i=1;i<n;++i )
{
if( sum[i-1]+a[i]>a[i] )
{
sum[i]=sum[i-1]+a[i];
pre[i]=pre[i-1];
}
else
sum[i]=pre[i]=a[i];
} // 寻找最大子序列和。存下下标
Max=-999999;
for( i=0;i<n;++i )
{
if( sum[i]>Max )
{
Max=sum[i];
Max_i=i;
}
} printf("%d %d %d\n",Max,pre[Max_i],a[Max_i]);
}
return 0;
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

ACM-DP最大连续子——hdu1231的更多相关文章

  1. hdu1003 最大连续子序和

    Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub ...

  2. 【剑指offer】最大和连续子阵列

    个開始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组測试数据包括两行. 第一行为一个整数n(0<=n<=100000),当n=0时,输入结束.接下去的一行包括n个整数 ...

  3. LeetCode 581. Shortest Unsorted Continuous Subarray (最短无序连续子数组)

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  4. [LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  5. Java课程课后作业190315之从文档中读取随机数并得到最大连续子数组

    从我上一篇随笔中,我们可以得到最大连续子数组. 按照要求,我们需要从TXT文档中读取随机数,那在此之前,我们需要在程序中写入随机数 import java.io.File; import java.i ...

  6. UVALive 3938 - "Ray, Pass me the dishes!" - [最大连续子列和+线段树]

    题目链接:https://cn.vjudge.net/problem/UVALive-3938 参考刘汝佳书上说的: 题意: 给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列 $[a,b] ...

  7. Leetcode 581.最短无序连续子数组

    最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, ...

  8. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

    581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...

  9. 【LeetCode】1438. 绝对差不超过限制的最长连续子数组 Longest Continuous Subarray With Absolute Diff Less Than or Equal t

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址:https://leetco ...

随机推荐

  1. Base64实现android端图片上传到server端

    首先要下载Base64.java文件http://iharder.sourceforge.net/current/java/base64/ 将代码复制到project中. 然后上代码: android ...

  2. Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)

    今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1)        磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...

  3. WPF遮蔽层的实现

    在一些项目中,难免会有耗时的加载,如果加载时没有提示,给人一种假死的感觉,很不友好,那么现在福利来啦,WPF版的模态窗体,先上效果图 实际效果指针是转动的,话不多说,一大批干货来袭 XMAL的代码 W ...

  4. 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁

    上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和基本的方法,显示了怎样 ...

  5. 学习OpenCV第0天

    自2011年接触OpenCV已经有几年了,一直停留在写一些小程序,利用手冊完毕一些任务,一直没有深入研究当中代码,现在毕业,但各种原因未能进入图像处理行业,故现重学OpenCV,包含分析代码,学习算法 ...

  6. J2SE基础:1.类和对象基础

    什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...

  7. SVM-SVM概述

    (一)SVM背景资料简介 支持向量机(Support Vector Machine)这是Cortes和Vapnik至1995首次提出,样本.非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到 ...

  8. 使用Visual Studio 2010 创建简单的Silverlight应用程序

    使用Visual Studio 2010 创建简单的Silverlight应用程序 Silverlight是创建动态的引人的RIAs(Rich Internet Application)的新方法.这里 ...

  9. VC6 鼠标钩子 最简单样例

    Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...

  10. live555 for Android

    因为Live555 包中未提供Android 的config 所以编译器来比較麻烦,须要自己编写Android.mk ,下面是我通过 改动 现有的config文件,在cygwin实现 编译的过程,co ...