Max Sum(动态规划)
原创
http://acm.hdu.edu.cn/showproblem.php?pid=1003
题目要求求出一个序列里面的最大序列和,序列要求是连续的,给出最大序列和,序列首元素下标和尾元素下标,按特定的格式输出。
解题思路:
动态规划,我们可以将所有序列按以序列中的元素a[i](i=1~n)结尾进行分类,比如:
以a[1]结尾的序列有:a[1]
以a[2]结尾的序列有:a[1]a[2],a[2]
以a[3]结尾的序列有:a[1]a[2]a[3],a[2][3],a[3]
......
这样所有序列都会包含在其中,一共被分为n大组,每大组里面包含许多小序列,从每大组里面选出最大的序列和,这样会选出n个
序列和,再从n个序列和中选出最大的就是题目要求的最大序列和了。
动态规划公式演算:
之前说过有n大组,用dp[]存储从每大组中选出来的最大序列和,其中
dp[1]=a[1]
dp[2]=max(a[1]a[2],a[2]),即从两个序列里面选出序列和最大的,既然只需要比较序列和,两个数比较大小,两个数同时减去一
个相同的数不影响比较,那么两个序列都先把元素a[2]减去,这样就成了dp[2]=max(dp[1]+a[2],a[2])。
dp[3]=max(a[1]a[2]a[3],a[2][3],a[3]),写成max(a[1]a[2]+a[3],a[2]+[3],0+a[3])更容易理解动态规划思想,3个序列都先把
a[3]提出变成max(a[1]a[2],a[2],0),再变成max(max(a[1]a[2],a[2]),0),三个数比较,可以先比较其中2个,再和第三个比较,
可以发现max(a[1]a[2],a[2])就是dp[2],所以max(a[1]a[2],a[2],0)就是max(dp[2],0),加回a[3],max(dp[2]+a[3],a[3])。
所以我们可以轻而易举的按顺序求出n大组的序列和,然后再从n个序列和中求出最大的。
关于求最大序列和的首尾元素索引:
我们在求某个dp[i]的时候,代表目前是从以a[i]结尾的序列和中求出序列和最大的存入dp[i]中,所以尾元素可以得知。
尾元素得到,可以往回找到首元素。
Java AC
- import java.util.*;
- public class Main {
- public static void main(String[] args) {
- Scanner reader=new Scanner(System.in);
- int T=reader.nextInt();
- int count=1;
- while(T>0) {
- int N=reader.nextInt();
- int a[]=new int[N+1];
- for(int i=1;i<=N;i++) {
- a[i]=reader.nextInt();
- }
- int dp=a[1];
- int sum_Max=dp;
- int start=1;
- int end=1;
- for(int i=2;i<=N;i++) {
- dp=dp+a[i]>a[i]?(dp+a[i]):a[i]; //动态存储以a[1]~a[n]结尾的序列组的最大序列和
- if(dp>sum_Max) {
- sum_Max=dp;
- end=i; //结尾索引
- }
- }
- //寻找开头索引
- int sum=0;
- for(int i=end;i>=1;i--) {
- sum+=a[i];
- if(sum==sum_Max) {
- start=i;
- //这里不能break,当序列中存在多个序列具有同样的最大序列和,题目要求输出第一个被找到的序列
- }
- }
- System.out.println("Case "+count+":");
- System.out.println(sum_Max+" "+start+" "+end);
- if(T!=1) {
- System.out.println();
- }
- T--;
- count++;
- }
- }
- }
21:21:39
2018-08-19
Max Sum(动态规划)的更多相关文章
- HDU-1003 Max Sum(动态规划,最长字段和问题)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1003 Max Sum (动态规划 最大区间和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- hdu 1003 Max Sum(动态规划)
解题思路: 本题在给定的集合中找到最大的子集合[子集合:集合的元素的总和,是所有子集合中的最大解.] 结果输出: 最大的子集合的所有元素的和,子集合在集合中的范围区间. 依次对元素相加,存到一个 su ...
- HDOJ-1003 Max Sum(最大连续子段 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDU 1024 Max Sum Plus Plus (动态规划)
HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...
- HDU 1024 Max Sum Plus Plus (动态规划、最大m子段和)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDOJ 1024 Max Sum Plus Plus -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Problem Description Now I think you have got an ...
随机推荐
- OPCDAAuto.dll的C#使用方法浅析
上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...
- AIX PowerHA (HACMP) Commands
PowerHA(HACMP) Commands How to start cluster daemons (options in that order: clstrmgr, clsmuxpd, br ...
- unittest框架,调用函数类 和 调用函数外的 方法
- 【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题
目录(?)[-] 横竖屏切换的问题 WeakReference 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...
- LevelDB Cache实现机制分析
几天前淘宝量子恒道在博客上分析了HBase的Cache机制,本篇文章,结合LevelDB 1.7.0版本的源码,分析下LevelDB的Cache机制. 概述 LevelDB是Google开源的持久化K ...
- MySQL-事务的实现-redo
MySQL中事务: 事务的实现: ACID: 原子性(A : Atomicity) 一致性(C : consistency ) 隔离性(I : isolation) 持久性(D : dura ...
- Java-Maven-Runoob:Maven 仓库
ylbtech-Java-Maven-Runoob:Maven 仓库 1.返回顶部 1. Maven 仓库 在 Maven 的术语中,仓库是一个位置(place). Maven 仓库是项目中依赖的第三 ...
- python开发面向对象基础:人狗大战学面向对象
一,通过函数写人狗大战这个故事 #!/usr/bin/env python #_*_coding:utf-8_*_ #1.函数 人模子 def person(name,level,life_value ...
- shell命令getopts
#!/bin/bash set -e cmd="ls" while getopts :a:t:sn opt; do case $opt in a) cmd=$cmd" - ...
- BigDecimal进行精确运算demo工具类
package com.js.ai.modules.pointwall.interfac; import java.math.BigDecimal; public class TestDigDecim ...