经典的最大子列和问题,经典的DP题,但是并不想DP(实际是DP渣),于是用了在线算法,时间复杂度同样O(n)
上码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num,*a,ans=0;
int i,t;
int n;
scanf("%d",&n);
int j;
for (j=0;j<n;j++) {
scanf("%d",&num);
int *a=malloc(sizeof(int)*(num+1));
int max = 0, ans = -1001;
int start = 1, end = 1,start1 = 1,end1 = 0; //start,end记录最优解的起始与结束位置;start1,end1记录当前状态的起始位置
for(i=0;i<num;i++){
scanf("%d",&a[i]);
max += a[i];
end1 ++;
if (ans<max) {
ans=max;
start = start1;
end = end1;
}
if (max<0) { // 算法核心是遇到负值便清零
max=0;
start1=i+2;
end1=i+1;
}
}
printf("Case %d:\n",j+1);
printf("%d %d %d\n",ans,start,end);
if (j != n-1) {
printf("\n");
}
}
return 0;
}