int gcd(int a,int b){
int tmp;
while(a&&b){
tmp = a % b;
a = b;
b = tmp;
}
return a;
}
//最大子序列和
//分治法
int maxsum(int a,int begin,int end){
int mid,left,right,sumleft,sumright,maxleft,maxright,i,sum,max;
if(begin<end){
mid = (begin + end) / 2;
sumleft = maxsum(a,begin,mid);
sumright = maxsum(a,mid + 1,end);
left = begin;
right = end;
maxleft = maxright = 0;
sum = 0;
for(i = mid;i>=begin,i--){
sum += a[i];
if(sum>maxleft)
maxleft = sum;
}
sum = 0;
for(i = mid+1;i>=end;i--){
sum += a[i];
if(sum>maxright)
maxright = sum;
}
max = sumleft;
if(sumright>max) max = sumright;
if(maxright+maxleft>max) max = maxright + maxleft;
return max;
}
else if(a[begin]>0) return a[begin];
else return 0;
}
int MaxSubsequenceSum(int a,int n){
return maxsum(a,0,n-1);
}
//动态规划求最大子序列和
int MaxSubsequenceSum(int a,int n){
int sum;
int i;
sum = 0;
for(i = 0;i<n;i++)
{
sum += a[i];
if(sum<0) sum = 0;
}
return sum;
}