HDU 1003 Max Sum (动态规划 最大区间和)
Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 330535 Accepted Submission(s): 78678
Problem Description
Input
first line of the input contains an integer T(1<=T<=20) which
means the number of test cases. Then T lines follow, each line starts
with a number N(1<=N<=100000), then N integers followed(all the
integers are between -1000 and 1000).
Output
each test case, you should output two lines. The first line is "Case
#:", # means the number of the test case. The second line contains three
integers, the Max Sum in the sequence, the start position of the
sub-sequence, the end position of the sub-sequence. If there are more
than one result, output the first one. Output a blank line between two
cases.
Sample Input
- -
- - -
Sample Output
Case : Case :
题目大意与分析
就是给你一个序列,求最大区间和以及该最大区间的下标
动态规划的思想:
用dp[i]来代表以a[i]为结尾的最大区间和,这样就有两种情况:
要么dp[i]是正的 那么以a[i]结尾的最大区间和就是dp[i-1]+a[i](因为必须是a[i]结尾,a[i]是正是负都无法取舍的)
要么dp[i]是负的 那么以a[i]结尾的最大区间和就是a[i]
状态转移方程:dp[i] = max( dp[i-1]+a[i], a[i] );
初始化:因为我们从前往后推,可以将dp数组和a数组合二为一,节约空间
另外需要注意的是 需要三个游标:s、l、r 分别代表当前区间的左端点、最大区间的左端点、最大区间的右断点,至于当前区间的右端点,可以直接用i表示。
代码
#include<bits/stdc++.h> using namespace std; int T,n,i,dp[],l,r,s,maxs,t=; int main()
{
cin>>T;
while(T--)
{
t++;
memset(dp,,sizeof(dp));
cin>>n;
for(i=;i<=n;i++)
{
scanf("%d",&dp[i]);
}
maxs=dp[];
s=;
l=;
r=;
for(i=;i<=n;i++)
{
dp[i]=max(dp[i-]+dp[i],dp[i]);
if(dp[i-]<)
{
s=i;
}
if(dp[i]>maxs)
{
l=s;
r=i;
maxs=dp[i];
}
}
printf("Case %d:\n",t);
printf("%d %d %d\n",maxs,l,r);
if(T)
printf("\n");
}
}
HDU 1003 Max Sum (动态规划 最大区间和)的更多相关文章
- hdu 1003 Max Sum(动态规划)
解题思路: 本题在给定的集合中找到最大的子集合[子集合:集合的元素的总和,是所有子集合中的最大解.] 结果输出: 最大的子集合的所有元素的和,子集合在集合中的范围区间. 依次对元素相加,存到一个 su ...
- HDOJ(HDU).1003 Max Sum (DP)
HDOJ(HDU).1003 Max Sum (DP) 点我挑战题目 算法学习-–动态规划初探 题意分析 给出一段数字序列,求出最大连续子段和.典型的动态规划问题. 用数组a表示存储的数字序列,sum ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- hdu 1003 Max Sum (DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (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 1003 Max Sum (动态规划)
转载于acm之家http://www.acmerblog.com/hdu-1003-Max-Sum-1258.html Max Sum Time Limit: 2000/1000 MS (Java/O ...
- HDU 1003 Max Sum 求区间最大值 (尺取法)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行
测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...
- HDU 1003 Max Sum
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
随机推荐
- 实现分享功能(分享到qq空间,新浪微博)
//分享QQ好友 function qq(title,url,pic) { var p = { url: 'http://test.qichey ...
- redis-cli批量删除key
https://www.cnblogs.com/kiko2014551511/p/11531584.html redis-cli -a 密钥 keys "shiro*" | xar ...
- POJ 3422 矩阵取数 最小费用流拆点+负边
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9153 Accepted: ...
- unittest详解(一) unittest初识
unittest是python内置的一个单元测试框架,在学习怎么使用它之前,我们先来了解它的一些概念和原理. Test Case:测试用例,一个TestCase的实例就是一个测试用例.什么是测试用例呢 ...
- Linux命令-文件管理(二)
Linux命令-文件管理(二) Linux gitview命令 Linux gitview命令用于观看文件的内容,它会同时显示十六进制和ASCII格式的字码. 语法:gitview [-bchilv] ...
- 排序算法总结(java实现)
排序算法 介绍:排序分为内部排序和外部排序,内部排序指在内存中进行的排序过程:外部排序指在外存中进行排序的过程,但是此过程建立在多次访问内存的基础上(分成一段段利用内部排序进行排序). 以下排序均属于 ...
- spark 笔记 15: ShuffleManager,shuffle map两端的stage/task的桥梁
无论是Hadoop还是spark,shuffle操作都是决定其性能的重要因素.在不能减少shuffle的情况下,使用一个好的shuffle管理器也是优化性能的重要手段. ShuffleManager的 ...
- yagent使用说明
介绍 yagent是ycache的一个组件,用于管理memcached或redis的缓存实例.主要功能包括启动cache实例.将cache实例的信息写到zk上给yconsole使用.检测cache ...
- Mysql 基础操作命令
1,查看mysql的建表语句 show create table tableName; #tableName 库中已存在的表名
- Tomcat常见启动问题
1)闪退问题 原因:tomcat软件是java语言开发的. tomcat软件启动时,会默认到系统的环境变量中查找一个名称叫JAVA_HOME的变量.这个变量的作用找到tomcat启动所需的jvm. 解 ...