p115最大字段和
b[i]表示以当前数子为结尾的最大连续字段和
所求的结果是连续的字段和,注意是连续的!
如果一个数加上上一个有效序列得到的结果比这个数大,那么该数也属于这个有效序列(那么加上之前的)
如果一个数加上上一个有效序列得到的结果比这个数小,那么这个数单独成为一个新的有效序列
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
int ans = -2147483647;
for(int i = 1; i <= n; i++){
if(i == 1) b[i] = a[i];
else{
b[i] = max(a[i],b[i-1] + a[i]);
}
ans = max(ans,b[i]);
}
cout << ans << endl;
return 0;
}
HDU1003最大连续字段和
- 需要输出字段的起始位置和终止位置
#include <iostream>
using namespace std;
const int N = 100010;
int T;
int a[N],dp[N];
int n;
int main(){
cin >> T;
for(int k = 1; k <= T; k++){
cin >> n;
int _max = -2147483647;
for(int i = 1; i <= n; i++) cin >> a[i];
int l = 1, r = 1; // 记录区间
int start = 1; // 记录起点
for(int i = 1; i <= n; i++){
if(i == 1) dp[i] = a[i];
else{
if(dp[i-1] < 0){
dp[i] = a[i];
start = i;
}else{
dp[i] = dp[i-1] + a[i];
}
}
if(dp[i] > _max){
l = start;
r = i;
_max = dp[i];
}
}
if(k != 1) cout << endl;
cout << "Case " << k << ":" << endl;
cout << _max << " " << l << " " << r << endl;
}
return 0;
}