PATA1007 Maximum Subsequence Sum (25 分)
题意:
求连续子序列和 给出N个数, 问最大的连续若干数的和是多少, 并输出左右边界元素的值 如果所有数都小于0,那么认为最大的和为0,并且输出首尾元素
题解:
比较简单的dp问题, 设置一个last值保存上一次可取的最左区间, tmp表示当前的和 遍历数组, 依次累加入tmp, 如果tmp<0, 则负数没有必要取, 直接舍弃之前的tmp, 令last = i+1 如果tmp > sum, 即更新答案即可
注意如果不把sum初始化为-1的话, 会有一组数据过不去(全是0)
经验小结:
#include<bits/stdc++.h>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const int INF = 1 << 30;
const int MAXN = 1e4+10;
int n, a[MAXN];
int main() {
ios::sync_with_stdio(false);
cin >> n;
for(int i = 0; i < n; ++i)
cin >> a[i];
int last = 0, l = 0, r = n-1, tmp = 0, sum = -1;
for(int i = 0; i < n; ++i){
tmp += a[i];
if(tmp < 0){
tmp = 0;
last = i+1;
}else if(tmp > sum){
sum = tmp;
l = last, r = i;
}
}
if(sum < 0)
sum = 0;
cout << sum << ' ' << a[l] << ' ' << a[r] << endl;
return 0;
}
//1 2 3 4 -5 5 -2 8 -21