您的位置:首页 > 产品设计 > UI/UE

PAT (Advanced) 1007. Maximum Subsequence Sum (25)

2017-09-09 20:52 531 查看
原题:1007. Maximum Subsequence Sum (25)

解题思路:

1.设A
为对应的保存原始序列a
的以每个元素为结尾的子序列的和, 初始化时与a
相同, 同时设定一个len
记录每个子序列的长度。

2.由题设求最大子序列和,则将每个A[i](0 <= i < n)求出, 最后取最大值即可。

3.每个A[i]的求解,A[i]与A[i-1] 有如下关系:

A[i] = max(A[i], A[i-1] + a[i]);

      简单用数学归纳法证明:

当 i = 0时, 即A[0] = a[0], 显然成立,

假设当 i = k - 1时 A[k-1] 为 以a[k-1]为结尾的最大连续子序列和成立,

则 以a[k]为结尾的的A[k]无非两种情况,即A[k] 与 A[k-1] + a[k] , 取其中的最大值即可。

4.注意len
的更新。

c++代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10010;
int a[maxn], A[maxn], len[maxn];
//a[i]记录相应的元素值
//A[i]记录以a[i]结尾的最大子序列和
//len[i]记录相应的子序列长度
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
A[i] = a[i];
len[i] = 1;
}

for(int i = 1; i < n; i++)
{
if(A[i-1] + a[i] > A[i]) // 当前一序列加上当前元素的和比以当前元素为结尾的序列和大
{                        // 更新以当前元素为结尾的最大值
A[i] = A[i-1] + a[i];
len[i] = len[i] + len[i - 1]; //更新长度
}
}

int ansi, ans = -100000000;//ans要足够小
for(int i = 0; i < n; i++)
{
if(ans < A[i]) // 由题目输出条件 不可取等号
{
ans = A[i];
ansi = i;
}
}
if(ans < 0) // ans小于0特殊处理
printf("0 %d %d\n", a[0], a[n-1]);
else
printf("%d %d %d\n", ans, a[ansi - len[ansi] + 1], a[ansi]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: