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 ...
随机推荐
- str_split的用法(PHP学习)
str_split的用法: 先看看PHP手册是怎么说的 array str_split ( string $string [, int $split_length = 1 ] ) str_split返 ...
- ALTERA DDRII IP核使用
提到DDRII,大家应该都不陌生,DDRII SDRAM是第二代双倍速率同步动态RAM.今天小编给大家介绍一下QUARTUS II 下调用DDRII软核. 新建QUARTUSII工程之后,在tool下 ...
- Diffie-Hellman 密钥交换
假定有两个全局公开的参数,分别为一个素数p和一个整数g,g是p的一个原根,为了协商共享的会话密钥: 首先,用户A随机选取a,计算出A = g^a mod p,并将A发送给B:然后,用户B随机选取b,计 ...
- OBS第三方推流直播教程
第三方推流使用场景 1.当使用YY客户端进行直播遇到问题,暂无解决方法的时候,可以使用第三方直播软件OBS进行推流. 2.对OBS情有独钟的主播. OBS简介: OBS是一款比较好用的开源直播软件,目 ...
- Unity3D Demo
之前在Unity讨论Q群里总是有不少同学求项目资源和源码神马的,其实这种资源在官网很多,而且都比较规范和专业,很有参考价值,链接:https://www.assetstore.unity3d.com/ ...
- pymysql增删改查
#!/usr/bin/env python # encoding: utf-8 # Date: 2018/6/24 # 1.增删改import pymysql conn = pymysql.conn ...
- JAXB 专题二(BSP接口实战)
BSP下单接口 1.xml格式如下 <?xml version="1.0" encoding="utf-8"?> <Request servi ...
- Eclipse 代码风格配置
代码风格配置:
- android获取mp4视频文件总时长和视频宽高<转>
android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率. 根据该方式获取视频信息可以看出不仅仅可以获取时长和分辨率,还能获取到其他的一些视频信息,不错 ...
- rtmp发送H264及aac的音视频 (转)
RTMP推送的音视频流的封装形式和FLV格式相似,由此可知,向FMS推送H264和AAC直播流,需要首先发送"AVC sequence header"和"AAC sequ ...