HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)
Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 154155 Accepted Submission(s): 35958
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
14 1 4
Case 2:
7 1 6
最大连续子序列
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20109 Accepted Submission(s): 8884
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
-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
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
Hint
Huge input, scanf is recommended.
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAX 100005
- int main(void)
- {
- int t,n,count;
- int dp[MAX];
- int max,start,START,end;
- count = ;
- scanf("%d",&t);
- while(t --)
- {
- count ++;
- scanf("%d",&n);
- for(int i = ;i < n;i ++)
- scanf("%d",&dp[i]);
- max = dp[];
- start = START = end = ;
- for(int i = ;i < n;i ++)
- {
- if(dp[i - ] < && dp[i - ] != dp[i]) //讨论dp[i-1]小于0和大于等于0两种情况即可,后面的条件是为了符合题意
- start = i + ; //更新起点
- else if(dp[i - ] >= )
- dp[i] = dp[i - ] + dp[i]; //隐式地更新终点
- if(max < dp[i])
- {
- START = start;
- max = dp[i];
- end = i + ;
- }
- }
- printf("Case %d:\n",count);
- printf("%d %d %d\n",max,START,end);
- if(t)
- puts("");
- }
- return ;
- }
max sum
上面的代码我用了两个循环,下面这个版本只用了一个,速度反而没第一个快,不知为何。
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAX 100005
- int main(void)
- {
- int t,n,count;
- int dp[MAX];
- int max,start,START,end;
- count = ;
- scanf("%d",&t);
- while(t --)
- {
- count ++;
- scanf("%d",&n);
- for(int i = ;i < n;i ++) //在读入的时候就顺便处理,不知为何会更慢
- {
- scanf("%d",&dp[i]);
- if(!i)
- {
- max = dp[];
- start = START = end = ;
- }
- else if(dp[i - ] < && dp[i - ] != dp[i])
- start = i + ;
- else if(dp[i - ] >= )
- dp[i] = dp[i - ] + dp[i];
- if(max < dp[i])
- {
- START = start;
- max = dp[i];
- end = i + ;
- }
- }
- printf("Case %d:\n",count);
- printf("%d %d %d\n",max,START,end);
- if(t)
- puts("");
- }
- return ;
- }
max sum_2
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAX 10005
- int main(void)
- {
- int k;
- int dp[MAX],s[MAX],max,max_start,max_end,start;
- while(scanf("%d",&k) && k)
- {
- for(int i = ;i < k;i ++)
- scanf("%d",&s[i]);
- max = s[];
- dp[] = s[];
- max_start = max_end = start = ;
- for(int i = ;i < k;i ++)
- {
- if(dp[i - ] < && s[i] != dp[i - ]) //一样的讨论是否为负就行了
- {
- start = i;
- dp[i] = s[i];
- }
- else if(dp[i - ] >= )
- dp[i] = dp[i - ] + s[i];
- if(dp[i] > max)
- {
- max = dp[i];
- max_start = start;
- max_end = i;
- }
- }
- if(max < )
- {
- max = ;
- max_start = ;
- max_end = k - ;
- }
- printf("%d %d %d\n",max,s[max_start],s[max_end]);
- }
- return ;
- }
最大连续子序列
这题还有下面这个版本,就是用个双重循环来选出起点和终点,然后就算这个区间的值,可以用一个循环算出以1为起点的值,然后再计算的时候就可以用这个数组推出来,感觉挺不错的,也有DP的思想在里面,虽然超时了。
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAX 10005
- int main(void)
- {
- int k,i,j;
- long long s[MAX],dp[MAX],box,max,max_i,max_j;
- while(scanf("%d",&k) && k)
- {
- scanf("%lld",&dp[]);
- s[] = dp[];
- for(int i = ;i < k;i ++)
- {
- scanf("%lld",&dp[i]);
- s[i] = dp[i];
- dp[i] += dp[i - ]; //DP[i]保存以1为起点i为终点的区间的值
- }
- max = dp[];
- max_i = max_j = ;
- for(int i = ;i < k;i ++)
- for(int j = i;j < k;j ++)
- {
- if(i)
- box = dp[j] - dp[i - ]; //i...j区间的值等于1...j的值减去1...i-1的值
- else
- box = dp[j];
- if(box > max)
- {
- max = box;
- max_i = i;
- max_j = j;
- }
- }
- if(max < )
- {
- max = ;
- max_i = ;
- max_j = k - ;
- }
- printf("%lld %lld %lld\n",max,s[max_i],s[max_j]);
- }
- return ;
- }
最大连续子序列_2
HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)的更多相关文章
- 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 --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- HDOJ(HDU).1003 Max Sum (DP)
HDOJ(HDU).1003 Max Sum (DP) 点我挑战题目 算法学习-–动态规划初探 题意分析 给出一段数字序列,求出最大连续子段和.典型的动态规划问题. 用数组a表示存储的数字序列,sum ...
- HDU 1231.最大连续子序列-dp+位置标记
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 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 简单的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 Su ...
- hdu 1003 Max sum(简单DP)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...
- HDU 1003 Max Sum 解题报告
题目大意:求一串数字中,几个连续数字加起来最大值,并确定起始和最末的位置. 思路:这是一题DP题,但是可以用尺取法来做.我一开始不会,也是看了某大神的代码,然后有人告诉我这是尺取法,现在会了. //尺 ...
随机推荐
- PetaPoco T4模板修改生成实体
PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...
- MRI中T1和T2的含义与区分[转]
A. MRI名词解释 T1加权像.T2加权像为磁共振检查中报告中常提到的术语,很多非专业人士不明白是什么意思,要想认识何为T1加权像.T2加权像,请先了解几个基本概念: 1.磁共振(maget ...
- GetSafeHwnd()函数解释[转]
当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ ...
- DOM-判断元素节点类型
http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-i ...
- TL-WR703 USB不稳定/当前的总结
http://see.sl088.com/wiki/WR703_USB%E4%B8%8D%E7%A8%B3%E5%AE%9A/%E5%BD%93%E5%89%8D%E7%9A%84%E6%80%BB% ...
- Gmail POP3设置
好几个同事在问我怎样使用ThunderBird和OE收取IT CHT的邮箱,因为IT CHT就是用Gmail的功能,因此收发邮件是跟Gmail一样,下面是Gmail的POP&SMTP的设置方法 ...
- EntityFramework Code First 优化-IIS 8的第一次优化请求配置
首先需要在Window中添加Application Initialization Application Initialization 在IIS中配置Application Pool 编辑Applic ...
- cocos2dx A*算法
头文件和源文件拷贝到项目中就能用了! have fun 使用cocos2dx 3.2 原理都一样 淡蓝色的点是地图 深蓝色的点是障碍物 绿色的点是路径 暗绿色的点是搜寻过的点 红色的点是按路径行走的点 ...
- JS可以做什么,它的能力范围 View----------Request/Submit------------------Server
View----------Request/Submit------------------Server javascript--------><script>标签方式(页面,动态插 ...
- 去掉或者修改 input、select 等表单的【默认样式 】
隐藏input等表单的默认样式的背景: textarea,select,input{-webkit-appearance: none; -moz-appearance: none; -o-appear ...