您的位置:首页 > 其它

HDOJ HDU 1003 Max Sum

2017-09-02 11:56 465 查看

HDOJ 1003 Max Sum

题目

点击查看 HDOJ 1103 Max Sum

题意

给t组数据

行首是序列个数n 接着为n个数的序列

求该序列的连续最大和

难点

动态规划策略 或 贪心策略

题解

看到有人用动态规划

但是我觉得此题用贪心最易懂直接

贪心算法

从和为非负数的位置(起始位置)开始到当前位置的最大序列和和与所有最大序列和作比较,取最大值保存并区间始末

关键

当前序列和值为负数时,序列一定终止(否则之后的序列会变小)

举例

序列 0 6 -1 1 -6 7 -8 7 1

当前序列当前最大和序列最大和最大序列首最大序列末
1 - 10011
1 - 26612
1 - 35612
1 - 46612
1 - 50612
1 - 67716
1 - 7-1716
8 - 87716
8 - 98889
输出 8 8 9

技巧

宏定义32位int的- 1

#define ninf 0x80000000

代码

#include <iostream>
#define ninf 0x80000000
#define max 100000
using namespace std;

int a[max];

int main()
{
int t,n,f,l,tf,tl,res,sum;
cin >> t;
for(int z = 1;z <= t;z++)
{
cin >> n;
tf = tl = f = 0;
sum = 0;
res = ninf;
for(int i = 0;i < n;i++)
{
cin >> a[i];
sum += a[i];
if(sum > res)
{
tf = f;
tl = i;
res = sum;
}
if(sum < 0)
{
f = i+1;
sum = 0;
}
}
cout << "Case " << z << ":" << endl;
cout << res << " " << tf + 1 << " " << tl + 1 << endl;
if(z != t)
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDOJ HDU 算法