【ACM】 1231 最大连续子序列
[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 最大连续子序列的更多相关文章
- HDU 1231 最大连续子序列 --- 入门DP
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- HDU 1231.最大连续子序列-dp+位置标记
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDU 1231 最大连续子序列:水dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 题意: 给你一个整数序列,求连续子序列元素之和最大,并输出该序列的首尾元素(若不唯一,输出首坐标 ...
- DP专题训练之HDU 1231 最大连续子序列
Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
C - 最大连续子序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- HDU 1231 最大连续子序列(水题)
题目链接: 传送门 最大连续子序列 Time Limit: 1000MS Memory Limit: 32768 K Description 给定K个整数的序列{ N1, N2, ..., N ...
- HDU 1231:最大连续子序列 解题报告
第一次写博客, 自己总结写出了一道题感觉值得保存. 自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大 ...
- 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 ...
- hdoj 1231 最大连续子序列
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
随机推荐
- hdu4009最小树形图板子题
/*调了一下午的最小树形图,昨天刚刚看懂模板..最小树形图,就是有向图的最小生成树,很神奇==*/ #include<iostream> #include<cstring> # ...
- 眼底血管分割训练函数(SVM,Adaboost)
# -*- coding: utf-8 -*- import numpy as np from sklearn import svm from sklearn.model_selection impo ...
- python面向对象三大特性之封装
一. 概述 定义:隐藏对象的属性和实现细节,仅对外提供公共访问方式 封装的原则:把不需要对外提供的内容都隐藏起来,提供公共的方法访问这些隐藏属性 二.封装手段 使用双下划线将属性和方法隐藏起来 cla ...
- javaScript中的querySelector()与querySelectorAll()的区别
之前,在JavaScript获取文档元素一文中,我曾介绍了获取文档元素的几种方法,最后一种方法是通过选择器获取文档元素.它的核心思想便是利用querySelector()或querySelectorA ...
- 点击图片弹出input type=file选择器
<label for="UploadCoverPhoto" class="cursor-pointer"> <img class=" ...
- jQuery字体缩放缩放插件zoomFontSize.js
插件描述:jQuery字体缩放缩放插件zoomFontSize.js根据父类进行百分比缩放,兼容性如下: 使用方法 body 的class属性 添加 changbody_fontSize 而且整个页面 ...
- 【回顾】html属性、标题、段落、文本格式化
1.HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name="value". HTML 提 ...
- [转]Ubuntu /home下中文目录如何修改成英文?
http://www.linuxidc.com/Linux/2016-05/130873.htm 打开终端,在终端中输入命令: export LANG=en_US xdg-user-dirs-gtk- ...
- nginx做代理安装docker
1.环境 服务器IP 服务用途 是否能 联网 192.168.126.128 docker服务器(简称B服务器) 不能 192.168.126.130 nginx服务器(简称A服务器) 能 2.背景 ...
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)
前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并 ...