[1231 最大连续子序列
**
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 38975 Accepted Submission(s): 17603
**
浙大计算机研究生复试上机考试-2005年


要勾选c++才能过;
题意:输入一串数列,输出该数列的最大连续子序列(不能间隔),以及该最大连续子序列的第一个和最后一个元素。
EG:-2 11 -4 13 -5 -2
output 11+(-4)+13=20
思路:用数组temp[]存储输入的数列;
定义两个变量(maxLeft maxRight)保存最大连续子序列的 最左最右两个元素(第一和最后一个元素)在原数列的下标;
maxSum表示最大的和;
thisSum当前正在遍历 的子序列的和;
thisLeft当前正在遍历 的子序列的最左边的元素。

难点:如何区分那些元素在最大连续子序列中?最大和?
其实很简单,先让maxSum=temp[0],如果thisSum<0,舍弃当前遍历的子序列,进入下一个新的子序列,每次进入下一子序列时thisSum=0,
(EG:-1 4 -2 -1 -7 9 -1 3)
分成了3个连续子序列。而最大连续子序列可能是子序列的子序列。

如何记录 子序列的第一和最后一个元素?
每次thisSum<0时,记录下一元素角标为thisLeft;
当thisSum为当前最大和时,maxLeft=thisLeft,maxRight=i(for循环里的局部变量,控制次数)

注意:
必须 有memset(temp,0,sizeof(temp));初始化,不然输出的结果有时候是错误的。

#include <stdio.h>
#include<string> int main()
{
int n, maxLeft, maxRight, maxSum, temp[10005];
int thisLeft, thisSum;
while(scanf("%d", &n)!=EOF&&n)
{
memset(temp,0,sizeof(temp));
scanf("%d", &temp[0]);
thisLeft = maxLeft = maxRight = 0;
maxSum=temp[0];
thisSum = maxSum;
if(thisSum < 0)
{
thisSum = 0; thisLeft = 1;
}
for(int i = 1; i < n; ++i)
{
scanf("%d", &temp[i]);
thisSum += temp[i];
if(thisSum > maxSum)
{
maxSum = thisSum;
maxLeft = thisLeft;
maxRight = i;
}
if(thisSum < 0)
{
thisLeft = i + 1;
thisSum = 0;
}
}
if(maxSum>=0)
printf("%d %d %d\n", maxSum,temp[maxLeft], temp[maxRight]);
else
printf("%d %d %d\n", 0,temp[0], temp[n-1]); }
return 0;
}

【ACM】 1231 最大连续子序列的更多相关文章

  1. HDU 1231 最大连续子序列 --- 入门DP

    HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...

  2. HDU 1231.最大连续子序列-dp+位置标记

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

  3. HDU 1231 最大连续子序列:水dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 题意: 给你一个整数序列,求连续子序列元素之和最大,并输出该序列的首尾元素(若不唯一,输出首坐标 ...

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

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

  5. HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)

    C - 最大连续子序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

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

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

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

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

  8. HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. hdoj 1231 最大连续子序列

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

随机推荐

  1. Python使用re模块实现正则表达式操作

    Python提供了re模块,用于实现正则表达式的操作.在实现时,可以使用re模块提供的方法(如search().match().findall()等)进行字符串处理,也可以先使用re模块的compil ...

  2. spring cloud Eureka常见问题总结

    Spring Cloud中,Eureka常见问题总结. 指定Eureka的Environment 1 eureka.environment: 指定环境 参考文档:https://github.com/ ...

  3. fastJson常用方法总结

    1.了解json json就是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "" 双引号内是属性或值 : 冒号表示后者是前者的值(这个值 ...

  4. Android播放功能的实现

    Android播放语言功能的实现 需要用到的类文件TextToSpeech,此类可以实现播放语言的功能 支持播放的语言1.英语 2.法语 3.德语 4.意语 5.西班牙语 1.实例化此类,添加上下文对 ...

  5. 迅速上手:使用taro构建微信小程序基础教程

    前言 由于微信小程序在开发上不能安装npm依赖,和开发流程上也饱受诟病:Taro 是由京东·凹凸实验室(aotu.io)倾力打造的 多端开发解决方案,它的api基于react,在本篇文章中主要介绍了使 ...

  6. web应用启动后发现被自动访问

    为了找到原因,做了以下操作,发现是eclipse访问的,但是具体原因未知

  7. Redis分布式锁(ServiceStack.Redis实现)

    1.设计思路 由于Redis是单线程模型,命令操作原子性,所以利用这个特性可以很容易的实现分布式锁.A用户端在Resdis写入1个KEY,其他的用户无法写入这个KEY,实现锁的效果.A用户使用完成后释 ...

  8. NPOI导出Excel帮助类

    工具类 using System; using System.Collections.Generic; using System.Data; using System.IO; using System ...

  9. Nginx代理实现内网主机访问公网服务

    通过Nginx代理实现内网主机访问公网和接口服务 1.需求: m2.test.com为公司测试环境的微信测试域名,因为要调用微信服务接口需要访问外网,现通过Nginx代理现实此功能. 2.环境如下: ...

  10. 跨域资源共享 CORS 详解(转自阮一峰博客)

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...