ACM_HDU 1231 最大连续子序列 (dp)_代码分析
Problem Description
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Input
Output
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号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
#include <stdio.h>
#define MAXN 10005
int array[MAXN];
int dp[MAXN];
int main()
{
int n, start, end, submax, left, i;
/********start是最大子区间起点值,end为终点值。
*********submax是以array[i]为最右值的最大连续
*********子区间的值,left是这个子区间的起点值。***/
while ( scanf("%d",&n) && n != )
{
for ( i = ; i < n; i++ )
scanf("%d",&array[i]);
dp[] = submax = array[];//用于初始化
start = end = array[];
for ( i = ; i < n; i++ )//遍历数组
{/******如果当前的这个数,比之前加起来的再起上自己本身还要多,
****则用这个数作为起点,并标记为最大值。**************/
if ( array[i] > submax + array[i] )
/****submax/left都是缓存的变量,如果不合适,就会被更新掉即不断累加******/
submax = left = array[i];
/*************否则继续加******************/
else
submax = submax + array[i];
/*************为了与array[i]保持同步更新****
**************关键的是此次累加或比之前都大的数与前一次的最大值相比较,谁大****/
if ( dp[i-] >= submax )
dp[i] = dp[i-];
else
{/***************如果这次大,那么更新***************************/
dp[i] = submax;
end = array[i];
/************left只有在比之前加起来的再起上自己本身还要大时才会赋值,会赋值多次,但是次数有限***************/
start = left;/*************这个left用的很好,请读者仔细想想******************/
}
}
/****************
若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
********************/
if ( dp[n-] < )
dp[n-] = , start = array[], end = array[n-];
printf("%d %d %d\n", dp[n-], start, end );
}
return ;
}
看完了上面的代码分析,再来总结“ 最大连续子序列”几个关键点:
1.当某个数比累加到此数的和还要大时,以此数为起点。
2.当累加到此数的最大和比之前的最大和还要大时,更新起点、最大和、终点。否则最大和及起点、终点值都不变。
3.若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
ACM_HDU 1231 最大连续子序列 (dp)_代码分析的更多相关文章
- HDU 1231.最大连续子序列-dp+位置标记
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 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
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- 【ACM】 1231 最大连续子序列
[1231 最大连续子序列 ** Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU 1231——最大连续子序列(DP)
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 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 最大连续子序列:水dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 题意: 给你一个整数序列,求连续子序列元素之和最大,并输出该序列的首尾元素(若不唯一,输出首坐标 ...
- HDU 1231 最大连续子序列 (dp)
题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= ...
随机推荐
- My blog
欢迎啦……嘿嘿 http://blog.csdn.net/zuguodexiaoguoabc http://blog.sina.com.cn/u/3914181130
- Cglib学习站点(转)
1.CGlib简单介绍,访问地址:http://www.blogjava.net/stone2083/archive/2008/03/16 /186615.html,从简单的示例到不同业务场景的变化, ...
- linux Bash bug修复记录
- perl 爬取上市公司业绩预告
<pre name="code" class="python">use LWP::UserAgent; use utf8; use DBI; use ...
- 飘逸的python - 用urlparse从url中抽离出想要的信息
最近有个需求,要检测配置中的那些url的域名是否都正常,即是否都能ping通. 不过配置中url格式是这样的 http://www.something.com:1234/ . 要ping的是www.s ...
- Java程序栈信息文件中的秘密(五)
最近发现在使用jstack工具在导出Java应用的线程栈时有一个小小的窍门,比如Linux环境上有一个用户为appuser,假如以这个用户启动了一个Java进程B,如果想要导出进程B的线程栈,则必须切 ...
- jquery表格可编辑修改表格里面的值,点击td变input无刷新更新表格
td点击后变为input可以输入,更新数据,无刷新更新 演示 XML/HTML Code <table border="0" cellpadding="0" ...
- 百度地图API 级别自动缩放
今天做一个基于百度地图API的小项目 查了很长时间apid都没有找到地图呈现出来的时候地图按坐标的多少自动缩放显示的等级比例,特此记录笔记!var points = [point1, point2,p ...
- 关于MATLAB中any和all的个人理解
any: any=1,有一个元素是1,即可: any=0,全部元素为0,即可. all: all=1,全部元素是1,即可: all=0,有一个元素是0,即可. ALL True if all elem ...
- C++如何将一个整数输出为小数
double a=3; //一定是double不能是int cout.setf(ios::fixed); cout.precision(2); cout< ...