分析:此为动态规划题,可以如下考虑:长度为K的数组的最大子序列,要么是不包含第K个数的前K-1个数构成的数组的最大子序列,要么是包含第K个数的最大序列(不妨称为末端最大序列)。可见,我们完备的考察了长度为K时的两种情况,且构造出了子问题。再考虑末端最大序列的求法,这其实是在两者:前K-1个数构成的数组的末端最大序列(因为要与第K个数连接起来),第K个数中做出选择。同样,我们完备地求解了该问题,也构造出了规模更小的子问题。
实现:核心是这两句:rearMaxSum = input[i]>rearMaxSum+input[i]? input[i] : rearMaxSum+input[i]; max = max>rearMaxSum? max:rearMaxSum; (for i in input)
AC Code:
// 动态规划
#include <stdio.h>
int main()
{
int T, N, caseNum;
int begCur, endCur, begRes, endRes;
int i;
int num;
int rs;
int ms;
if(scanf("%d", &T) != 1)
return -1;
caseNum = 0;
while(T--) {
rs = ms = -1001;
begRes = begCur = endRes = endCur =0;
scanf("%d", &N);
for (i = 0; i < N; ++i) {
scanf("%d", &num);
if(rs<0) {
rs = num;
begCur = endCur = i;
} else {
rs += num;
endCur = i;
}
if(rs>ms){
ms = rs;
begRes = begCur;
endRes = endCur;
}
}
if(caseNum)
printf("\n");
printf("Case %d:\n", ++caseNum);
printf("%d %d %d\n", ms, begRes+1, endRes+1);
}
return 0;
}