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

这道题貌似有很多前辈总结过,写写自己是怎样理解的吧。

 #include <iostream>
#include <cstdio> using namespace std;
int num[]; int main()
{
int K,start,end,thisMax,MAX;
while(scanf("%d",&K)&&K)
{
int count=,temp;
for(int i=;i<K;i++) {scanf("%d",&num[i]);if(num[i]<) count++;} if(count==K) {printf("0 %d %d\n",num[],num[K-]);continue;}
start=end=;
thisMax=MAX=num[]; for(int i=;i<K;i++)
{
if(thisMax<)
{
temp=i;
thisMax=;
}
thisMax+=num[i]; if(thisMax>MAX)
{
start=temp;
end=i;
MAX=thisMax;
}
}
printf("%d %d %d\n",MAX,num[start],num[end]);
}
return ;
}

设这一数组是a1,a2,.....,ai,ai+1,....an,首先初始化MAX=thisMAX=a1,start=end=1;然后对ai进行分析有MAX=(a[start],...,a[end]),thismax=(a[start],...,a[i-1]),其中i-1>=end;若thisMAX<0,则说明start......i-1中可以去掉end+1,...,i-1这一部分。对此我们可以用一个临时标界符temp来分开指示从i开始的连续和,这时thisMAX=0;开始新的求和,到此我们有两组“开始”,“结束”,”最大值“。第一组start,end,MAX;第二组:临时标界符temp,i-1,thismMAX;然后对i进行分析:

1.若ai<0,有假如thisMAX<0,则由于MAX至少大于等于0,所以不会更新;thisMAX>0(此时thisMAX一定是<=MAX的,不然在前面MAX的值一定会同步thisMAX的),又有thisMAX+ai<thisMAX<MAX,故仍旧不用更新

  2.若ai>0,实际上就是上述的两组进行比较,若thisMAX>MAX,则进行更新start=temp,end=i;MAX=thisMAX;

这就是我的理解。

动态规划 HDU1231-------最大连续子序列的更多相关文章

  1. hdu1231最大连续子序列(动态规划)

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

  2. 【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和

    1.最大字段和问题 求一个序列最大连续子序列之和. 例如序列[-1,-2,-3,4,5,-6]的最大子段和为4 + 5 = 9. ①枚举法 int MaxSum(int n,int *a){ int ...

  3. 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏

    题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...

  4. HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  5. 题解报告:hdu1231最大连续子序列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 Problem Description 给定K个整数的序列{ N1, N2, ..., NK } ...

  6. hdu1231 最大连续子序列

    #include<stdio.h> #include<string.h> #define maxn 10010 int a[maxn],dp[maxn]; int main() ...

  7. hdu1231最大连续子序列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1231 #include<iostream> #include<cstdio> ...

  8. HDU-1231 简单dp,连续子序列最大和,水

    1.HDU-1231 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 3.总结:水 题意:连续子序列最大和 #include<iostre ...

  9. 动态规划(Dynamic Programming, DP)---- 最大连续子序列和

    动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...

随机推荐

  1. 黄聪:WordPress 多站点建站教程(二):后台(管理网络)设置详解,如何管理子站的用户、主题、插件、设置等功能

    建立好了子站,我们需要有个地方配置所有子站的主题.插件等功能,我们可以在后台看到 我的站点--管理网络 如下图: 在 管理网络--仪表盘 里面,我们可以创新用户和站点,也提供了查询功能. 要注意的是: ...

  2. Java集合类综合

    Java集合类是JDK学习中的一个经典切入点,也是让初学者最初感受到Java魅力的地方之一,你一定不会忘记不需要关心大小的ArrayList,不用自己实现的Queue,和随处可见的HashMap.面试 ...

  3. java web 程序---javabean实例--登陆界面并显示用户名和密码

    重点:注意大小写,不注意细节,这点小事,还需要请教 发现一个问题,也是老师当时写的时候,发现代码没错,但是就是运行问题. 大家看,那个java类,我们要求是所有属性均为私有变量,但是方法为公有的,如果 ...

  4. [Android] 开发第五天

    布之前开发的 Android 电话拨号器 Android-Studio 已经带了发布菜单, Build -> Generate Signed APK 进入发布界面 我们新增一个证书,或者使用已有 ...

  5. F5 SNAT NAT相关

    SNAT: 跟路由器.防火墙一样,BIG-IP系统提供NAT (Network Address Translation)和SNAT(Secure Network Address Translation ...

  6. fdisk用法(转载)

    Linux下的fdisk功能是极其强大的,用它可以划分出最复杂的分区,下面简要介绍一下它的用法: 对于IDE硬盘,每块盘有一个设备名:对应于主板的四个IDE接口,设备名依次为:/dev/hda,/de ...

  7. centos7开发环境配置总结

    1.win10下SecureCRT SSH连接慢 2.CentOS 7下Samba服务器的安装与配置 3.

  8. 网页中显示pdf的方法

    非常好的在网页中显示pdf的方法 今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunki ...

  9. 概率分布之间的距离度量以及python实现

    1. 欧氏距离(Euclidean Distance)       欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧 ...

  10. 如何设置mysql允许外网访问

    修改表,登录mysql数据库,切换到mysql数据库,使用sql语句查看"select host,user from user ;" console: >use mysql; ...