刚才看了一下怎么求最长子序列之和,发现以前没看懂的东西,其实挺简单的,看来还是以前没有用心在学习啊。
最长子序列之和是指在一个数组中,求连续的和最大的子序列的和。
我所学习到的有三种方法,分别介绍如下:
第一种是朴素算法,也就是直接暴力求解,每次求一个子数组的最长子序列,总共求n个,最后求最大值。代码如下:
void fun1(){ //a为数组
int ans=a[0];
for(int i=1;i<n;i++){
int sum=0;
for(int j=i;j<n;j++){
sum+=a[j];
if(sum>ans){
ans=sum;
}
}
}
cout<<ans<<endl;
}
第二种方法是用到分治法,最长子数组必然是在左子数组或者右子数组或者左右子数组之间,所以只要求出这三者的最大值就可以了,代码如下:
int fun2(int l,int r){
if(l>r) return 0;
if(l==r) return a[r];
int mid=(l+r)/2;
int lmax=