题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
题意:
题中给出一个数组,让你求出子数组和的最大值,以及起始位置。
思路:
首先很容易想到 O(2N) O ( 2 N ) 的解法,但这明显是不行的。我们可以使用动态规划的思想解这道题。用 cur c u r 结构体保存当前子数组最大值的相关信息(最大值和起始位置), cur.sum c u r . s u m 初值为设为一个负数。然后循环读入每个数 t t ,如果 为不为负数,那我们有可能通过加上 t t 使得 有继续成长的空间,注意在这里,是否加 t t 与 的正负无直接关系,因为可能通过加上一个小负数,链接了两个子数组数组从而使得最终的结果变大,例如: 7 7 10 10 。如果 cur.sum c u r . s u m 为负数,那么我们没有必要在这个基础上去加 t t 了,直接令 ,也就是重新开始,不让之前的结果继续祸害新来的数。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,ro,r,t;
struct node{
int sum,sta,end;
};
void solve(){
t = -10000;
scanf("%d",&n);
node mxs = {t,-1,-1},cur = {t,-1,-1};
for(int i = 0;i < n;i ++){
scanf("%d",&t);
if(cur.sum < 0){
cur = {t,i,i};
if(cur.sum > mxs.sum)
mxs = cur;
}
else{
cur.sum += t;
cur.end = i;
}
if(cur.sum > mxs.sum)
mxs = cur;
}
cout << "Case " << ++ r << ":" << endl;
cout << mxs.sum << " " << mxs.sta + 1 << " " << mxs.end + 1 << endl;
cout << (r == ro ? "" : "\n");
}
int main(void){
scanf("%d",&ro);
while(r < ro)
solve();
return 0;
}