HDOJ1003 求最大子列
来源:互联网 发布:手机注册淘宝卖家账号 编辑:程序博客网 时间:2024/06/04 17:45
思路:
既然要求一个数列中最大子列的值。
第一种思路:暴力,直接遍历这个数列,但最大的数列元素个数有10000个,所以肯定超时;
所以想到第二种方法:只需要遍历一遍这个数列。从第一个数字一直往后加,求和,如果和一只在增大,那么不断更新最大值和 上限(题目输出要求中的第三个数字);
如果碰到所求和比最大值小了那么就不更新,一但发现所求和<0, 就把 “sum ”(所求和)变成这个元素。重新开始。
#include<stdio.h>
#include<string.h>
int main()
{
int T,kase=0,t=0;
scanf("%d",&T);
int a[100005];
while(T--){
t=0;
double sum=0,max=-10000;
int n,flag1=0,flag2=0;
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&a[i]);
}
for(int i=0; i<n; i++)
{
if(sum>=0){
sum+=a[i];//这里很好理解sum>=0就加上后面一个元素;
}
else{
sum = a[i];//这句,要写成这样,有些同学可能直接就写成sum=0了;举个例子-10000,200,200···;
//因为-10000为第一个元素,所以一开始加完后sum为-10000,第二次循环会跳过上面的if;
//所以sum=0;会丢失这个元素值;
t=i;//这里的t=i不能省略,
}
if(sum > max){
max = sum;
flag1=t;//为什么说不能省略上面的t=i呢。看例子,200,300,400,-10000,20,30,40;
//容易看出,-10000前后都大于0,如果碰到-10000相加后sum<0而马上改变flag1(输出要求中的第二个数),那么最后结果是(20,30,40)这个数列了;
flag2 = i;
}
}
printf("Case %d:\n%.0lf %d %d\n",++kase,max,flag1+1,flag2+1);
if(T)
printf("\n");
}
}
既然要求一个数列中最大子列的值。
第一种思路:暴力,直接遍历这个数列,但最大的数列元素个数有10000个,所以肯定超时;
所以想到第二种方法:只需要遍历一遍这个数列。从第一个数字一直往后加,求和,如果和一只在增大,那么不断更新最大值和 上限(题目输出要求中的第三个数字);
如果碰到所求和比最大值小了那么就不更新,一但发现所求和<0, 就把 “sum ”(所求和)变成这个元素。重新开始。
#include<stdio.h>
#include<string.h>
int main()
{
int T,kase=0,t=0;
scanf("%d",&T);
int a[100005];
while(T--){
t=0;
double sum=0,max=-10000;
int n,flag1=0,flag2=0;
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&a[i]);
}
for(int i=0; i<n; i++)
{
if(sum>=0){
sum+=a[i];//这里很好理解sum>=0就加上后面一个元素;
}
else{
sum = a[i];//这句,要写成这样,有些同学可能直接就写成sum=0了;举个例子-10000,200,200···;
//因为-10000为第一个元素,所以一开始加完后sum为-10000,第二次循环会跳过上面的if;
//所以sum=0;会丢失这个元素值;
t=i;//这里的t=i不能省略,
}
if(sum > max){
max = sum;
flag1=t;//为什么说不能省略上面的t=i呢。看例子,200,300,400,-10000,20,30,40;
//容易看出,-10000前后都大于0,如果碰到-10000相加后sum<0而马上改变flag1(输出要求中的第二个数),那么最后结果是(20,30,40)这个数列了;
flag2 = i;
}
}
printf("Case %d:\n%.0lf %d %d\n",++kase,max,flag1+1,flag2+1);
if(T)
printf("\n");
}
}
0 0
- HDOJ1003 求最大子列
- HDOJ1003 最大子数组
- HDOJ1003(最大连续子串)
- 求最大子列和
- 求最大子列和
- 最大子串和(HDOJ1003)
- 动态规划-最大子串 HDOJ1003
- 求数组的最大子列和
- 求最大的连续子列和
- 采用分治法求最大子列
- 求最大子列和 dp
- hdoj1003 Max Sum (DP 最大子序列求和)
- 求最大子列和问题两种算法比较
- 数据结构与算法--求最大子列和问题
- 求最大子列和的四种算法
- 学习笔记:数据结构、算法::求最大子列和
- 求整数序列的最大子列和
- 求最大子列和问题(浙江大学数据结构)
- intellij idea 2016.2.1激活
- 欢迎使用CSDN-markdown编辑器
- 获取view的控制器
- 世界上有195个国家和42个地区
- ubantu无线网配置
- HDOJ1003 求最大子列
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
- UVA 10474 Where is the Marble?
- Java 8 再不知道就老了
- 耳机输入设备注册(1)
- 为QtCreator项目模板添加自动中文支持
- Java:按值传递还是按引用传递详细解说
- 树结构练习——判断给定森林中有多少棵树(dfs)
- Android应用开发之所有动画使用详解