HDU 1231:最大连续子序列 解题报告
第一次写博客, 自己总结写出了一道题感觉值得保存。
自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大连续子序列), 每次求包括第N项在内的前N项最大值时记录开始下标。
列:1 2 -2 5 -8 3;
第1项:1 开始下标为1
第2项:3 开始下标为1
第3项:1 开始下标为1
第4项:6 开始下标为1
第5项:-2 开始下标为1
第6项: 3 开始下标为6
最大值为几在于其前面项最大值是不是小于0;
如果不小于0 即加上为最大 开始下标不变;
如果 小于0, 最大为自己本身, 开始下标变成自己下标;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 10010
#define max(a, b) (a > b ? a : b)
int max[N], a[N], start[N];// max[N]为前N项中 包括a[N]在内和的最大值, start[N]保存的是 前N项包括a[N]在内取最大值时的初始下标;
int main()
{
int i, n, j, flag, maxn, flag_end, flag_start;
while(scanf("%d", &n), n)
{
flag = 0;//标志来判断是不是所有元素都为负数;
for(i = 1; i <= n; i++)//从1开始,start[]的下标更容易理解;
{
scanf("%d", &a[i]);
if(a[i] >= 0)
flag = 1;//只要有一个数字不为负数,flag = 1;
}
if(flag == 0)
{
printf("0 %d %d\n", a[1], a[n]);//全为负数, 输出0, 第一项,最后一项;
continue;
}
max[1] = a[1], start[1] = 1;
for(i = 2; i <= n; i++)
{
if(max[i - 1] >= 0)
{
max[i] = max[i - 1] + a[i];//若a[i]的前一项大于0, 则加。
start[i] = start[i - 1];//开始坐标仍旧为前一项的开始坐标;
}
else
{
max[i] = a[i];//若前一项不大于0, 则用a[i]更新max[i]最大值;
start[i] = i;//开始坐标为i;
}
}
maxn = max[1];
flag_end = a[1];
flag_start = a[start[1]];//初始化,准备求最大连续子序列。
for(i = 1; i <= n; i++)
if(maxn < max[i])//更新最大连续子序列与起始下标, 结束下标;
{
maxn = max[i];
flag_end = a[i];
flag_start = a[start[i]];
}
printf("%d %d %d\n", maxn, flag_start, flag_end);
}
}
HDU 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 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
C - 最大连续子序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 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 最大连续子序列(水题)
题目链接: 传送门 最大连续子序列 Time Limit: 1000MS Memory Limit: 32768 K Description 给定K个整数的序列{ N1, N2, ..., 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 ...
- HDU 1231 最大连续子序列 (dp)
题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= ...
- HDU 1231——最大连续子序列(DP)
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
随机推荐
- Maven聚合与继承的实例讲解(一)
概述 在javaweb高速发展的今天,我们软件设计人员往往会用很多种方式对软件划分模块,目的就是为了能有清晰的设计和低耦合性的,高重用性的软件.Maven有很好的依赖管理系统(Dependency M ...
- oauth协议
微博 : 新浪 腾讯 OAuth 新浪微博 APP开发 步骤:1.注册新浪开发者账号 获取以下信息 client_id 123456 标示应用身份的 唯一的 有的也叫App Key sec ...
- javascript的语法结构
字符规范: javascript程序是采用的Unicode字符集编写的,并且区分大小写.但是html代码不区分大小写,比如,在html中点击事件就可以写成onClick或则onclick,但是在jav ...
- PoE以太网远程供电
每个以太网口向下挂设备提供的最大功率为 15.4W 通过3/5 类双绞线的信号线(1.3.2.6)同时传递数据和电流
- ListView的LayoutParams设置
// Temp is the root view that was found in the xml final View temp = createViewFromTag(root, name, a ...
- linux下配置redis
安装redis 1.下载文件 wget http://download.redis.io/releases/redis-2.8.12.tar.gz 2.解压文件 tar zxvf redis-2.8 ...
- Digital Roots 1013
Digital Roots 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:456 测试通过:162 描述 T ...
- python基础(三元运算+深浅拷贝+函数参数)
三元运算 三元运算,又称三目运算,主要作用是减少代码量,是对简单的条件语句的缩写. 书写格式: result = 值1 if 条件 else 值2 即如果条件成立,则将值1赋给result变量,如果不 ...
- JAVA基础知识之JDBC——ResultSet的滚动和更新(statement的额外参数)
ResultSet不仅可以内存中的一张二维表一样保存statement执行SQL的结果集,还能通过结果集修改DB的数据.ResultSetMetaData则可以用来获得ResultSet对象的相关信息 ...
- 数据库设计 Assignment 02
需求 1.0 请你试分析一下老师(教职工号,老师姓名,年龄),学生(学号,姓名,年龄),课程(课程号,课程名称,开课时间,上课地点)之间的关系, 注:多个老师可以同时教一门课 尝试画出该模型的E-R图 ...