HDOJ(HDU).1003 Max Sum (DP)

点我挑战题目

算法学习—–动态规划初探

题意分析

给出一段数字序列,求出最大连续子段和。典型的动态规划问题。

用数组a表示存储的数字序列,sum表示当前子段和,maxsum表示最大子段和。不妨设想:当sum为负数的时候:

1.当下一个数字a[i]为正数的时候,sum+a[i] < a[i],不如将sum归零重新计算

2.当下一个数字为负数的时候,sum+a[i]< 0 ,若再下一个数字还为负数,依旧可以得出和小于零……直到遇到一个正数,此时回到1的情况,不如将sum归零计算。

综上所述,当sum为负数的时候,归零

那么再看sum为正数的时候:

1.当下一个数字a[i]为正数的时候,当然选择加上a[i],并且可以更新maxsunm;

2.当下一个数字a[i]为负数的时候,由于不知道后面数字的情况,无法做出决策。

综上所述,当sum>maxsum的时候,要更新maxsum,并且一直累加a[i]

题目还要求输出这个子段的start位置和end位置。可以用x,y分别表示当前最优(大)的子段的开始和结束位置,然后再用sta和ed变量表示当前子段的开始和结束位置。结合上面的叙述:

1.当sum>maxsum的时候,即需要更新的时候,就要更新x和y的位置;

2.当sum< 0的时候,即需要使sum归零计算的时候,就需要把sta的位置置为i+1(指向下一个位置的数字);

以上分析过程就是DP的过程,不难设计出程序。

代码总览

/*
Title:HDOJ.1003
Author:pengwill
Date:2017-2-15
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define nmax 100005
using namespace std;
int a[nmax];
int main()
{
int t;
scanf("%d",&t);
for(int i = 1; i<= t; ++i){
if(i!=1) printf("\n");
printf("Case %d:\n",i);
int n,maxsum = 0,sum = 0,x =1, y=1,sta = 1, ed = 1;
scanf("%d",&n);
for(int i = 1;i <=n; ++i) scanf("%d",&a[i]);
maxsum = -1001;//2.将maxsum初始为-1001
sum = 0;
for(int i =1; i<=n; ++i){
sum+=a[i];ed = i;
if(sum>maxsum){//1.注意此处2个if的位置不能颠倒
maxsum = sum;
x = sta; y = i;
}
if(sum <0){
sta = i+1;
sum = 0;
}
}
printf("%d %d %d\n",maxsum,x,y);
}
return 0;
}

结合代码中的注释:

1.2个if不能颠倒:代码中第二if是指,若sum< 0则舍弃重新计算。但是我们考虑全为负数的情况,如:5 -1 -2 -3 -4 -5 -5,明显这组数据的maxsum应该是-1,若将第二个if放到前面,则无法更新maxsum。

2.将maxsum置为-1001也是考虑数据全为负数的情况,因为题目中还说到数字最小是-1000。

HDOJ(HDU).1003 Max Sum (DP)的更多相关文章

  1. hdu 1003 Max Sum (DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)   ...

  2. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  3. hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行

    测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...

  4. hdu 1003 Max sum(简单DP)

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

  5. 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 ...

  6. HDU 1003 Max Sum(DP)

    点我看题目 题意 : 就是让你从一个数列中找连续的数字要求他们的和最大. 思路 : 往前加然后再判断一下就行. #include <iostream> #include<stdio. ...

  7. hdu 1003 Max Sum(基础dp)

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

  8. HDU 1003 Max Sum【动态规划求最大子序列和详解 】

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

  9. HDU 1003 Max Sum (动规)

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

随机推荐

  1. AirtestIDE实践二:Poco框架试用

    上一篇用airtest框架做了一个梦幻西游手游的DEMO,这次看看poco的强大之处.首先安装poco:pip install pocoui 其次,把SDK集成到你家游戏中,我这直接用官网提供的一个U ...

  2. 第五模块·WEB开发基础-第3章jQuery&Bootstrap

    01-jQuery介绍 02-如何使用jQuery 03-jQuery的入口函数 04-jQuery对象和JS对象的相互转换 05-jQuery如何操作DOM 06-底层选择器 07-基本过滤器 08 ...

  3. git push origin master 错误解决办法

    一.错误代码如下: error: failed to push some refs to 'https://github.com/wbingithub/drag.git' 二.在网上搜了一下,如下写就 ...

  4. 浪在ACM新春大作战

    题目链接: # Name 补题状态 A Memory and Crow 已补 B Memory and Trident 已补 C Memory and De-Evolution 已补 D Memory ...

  5. 关于onclick和addeventlistener('click'),click的整理

    代码 $(function(){ $("#btn").click(function(){ console.log(2) }) $("#btn").click(f ...

  6. android入门 — PopupWindow

    第一步:自定义xml文件 第二步:获取LayoutInflater对象 第三步:调用inflate()方法获取View对象 第四步:创建PopupWindow对象 第五步:调用PopupWindow的 ...

  7. lintcode-16-带重复元素的排列

    带重复元素的排列 给出一个具有重复数字的列表,找出列表所有不同的排列. #### 样例 给出列表 [1,2,2],不同的排列有: [ [1,2,2], [2,1,2], [2,2,1] ] 挑战 使用 ...

  8. Swift中避免在多个文件中重复import相同的第三方包

    swift中由于有命名空间的存在,在同一个target创建的文件,都可以不引用直接就可以拿来使用,但是不同target之间必须要import 之后才能使用,在不同的文件中使用都要重复的import这个 ...

  9. Debian 7 amd64问题

    Debian 7 发布了有1段时间,最近才在自己的电脑硬盘安装,用户体验还算可以.在安装Debian的过程中,有问题还是要记录一下的. 注意:遇到的问题跟硬件体系相关,可能在个别电脑没法重现. 1.默 ...

  10. flash builder 4.6在debug调试时需要系统安装flashplayer debug版本

    http://blog.csdn.net/cupid0051/article/details/46684295